我有一个在Jboss 7(EAP 6.4)上运行的EE6 JAX-RS应用程序,并通过ExceptionMapper
的实现在内部处理大多数异常和错误。
但是,有些情况(最明显的是当HTTP Basic Auth失败时)没有调用,因为错误发生在调用应用程序之前,因此客户端获取服务器的默认错误页面(JBWEB bla bla,HTML with丑陋的紫色)。
现在为了捕捉这些“外部”错误,我将<error-page>
定义添加到web.xml
,如下所示:
<error-page>
<location>/error.json</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error401.json</location>
</error-page>
该位置正常,我几乎获得我想要的响应但HTTP状态代码始终为200.
至少可以说这很烦人。如何让错误页面返回正确的错误代码?
答案 0 :(得分:1)
我最终得到的是编写一个小型Web服务(而不是静态页面),它会给我一个JSON响应和正确的HTTP状态代码,以及相关的标题:
<error-page>
<error-code>401</error-code>
<location>/error/401</location>
</error-page>
调用服务
@Path("/error")
public class ErrorService {
private static final Map<Integer, String> statusMsg;
static
{
statusMsg = new HashMap<Integer, String>();
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)。
答案 1 :(得分:0)
错误页面机制的目的是向最终用户显示人类可读的内容。如果它返回一些除200之外的代码,它将由浏览器以常见方式处理(浏览器的标准错误消息)。