我有一个在Jboss 7(EAP 6.4)上运行的EE6 JAX-RS应用程序,并通过ExceptionMapper的实现在内部处理其大多数异常和错误。
但是,在某些情况下(尤其是在HTTP Basic Auth失败时),由于未在调用应用程序之前发生错误,因此未调用它,因此客户端获得服务器的默认错误页面(JBWEB bla bla,带有难看的紫色紫色的HTML) )。
现在,为了捕获这些"外部"错误,我在web.xml中添加了定义,如下所示:
/error.json
401
/error401.json
该位置工作正常,我几乎得到了想要的响应,但是HTTP状态代码始终为200。
至少可以这样说,这很烦人。 如何获取错误页面以返回其正确的错误代码?
消费错误并使用该类的builder方法返回Response。 或使用ExceptionMapper类。
消耗错误是什么意思? 您的意思是写一些servlet / JAX-RS端点而不是静态json文件? 这就是我最终要做的,但是感觉有点不对:没有任何设置,Jboss返回的HTML具有正确的HTTP状态。 当我在web.xml中指定页面时,Jboss返回该页面(很好),但是将状态代码更改为200(为什么?)
不,我的意思是这样或那样的帮助吗?
可悲的是没有。 我在JAX-RS应用程序中已经有一个ExceptionMapper,它将处理我的代码可能引发的任何异常。 不幸的是,HTTP Basic身份验证(使用web.xml和安全领域)发生在JAX-RS之外,因此从未调用过Mapper。
我最终写的是编写一个小型Web服务(而不是静态页面),该服务将为我提供JSON响应和正确的HTTP状态代码以及相关的标头:
401
/error/401
哪个叫服务
@Path("/error")
public class ErrorService {
private static final Map statusMsg;
static
{
statusMsg = new HashMap();
statusMsg.put(401,"Resource requires authentication");
statusMsg.put(403,"Access denied");
statusMsg.put(404,"Resource not found");
statusMsg.put(500,"Internal server error");
}
@GET
@Path("{httpStatus}")
public Response error(@PathParam("httpStatus") Integer httpStatus) {
String msg = statusMsg.get(httpStatus);
if (msg == null)
msg ="Unexpected error";
throw new MyWebApplicationException.Builder()
.status(httpStatus)
.addError(msg)
.build();
}
}
我有一个具有自己的生成器模式的异常类MyWebApplicationException,我以前已经使用jax-rs ExceptionMapper将各种应用程序错误格式化为JSON。
所以现在我只是通过相同的通道手动输入外部捕获的错误(例如JAX-RS外部发生的401)。
错误页面机制的目的是向最终用户展示人类可读的内容。 如果返回的代码不是200,它将由浏览器以常见方式处理(浏览器的标准错误消息)。
那不可能是真的。 Jboss(即EAP)默认错误页面会返回正确的状态代码。 如果未指定,则登录失败将使我看到紫色的JBWEB000065页面,其HTTP状态为401。