我的问题是我注册的错误处理程序代码不适用于所有错误。在我的web.xml中,我注册了我的默认错误处理程序:
<servlet>
<servlet-name>ShowErrorHandlerServlet</servlet-name>
<servlet-class>tools.ErrorHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowErrorHandlerServlet</servlet-name>
<url-pattern>/showerror</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/showerror</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/showerror</location>
</error-page>
<error-page>
<location>/showerror</location>
</error-page>
我正在使用Jersey来映射休息请求,例如像这样的东西:
@GET
@Path("/throwError")
public void testThrowUnauthException() {
// String s = null;
// s.toString();
// /*
// * this nullpointer exception would be caught correctly because of
// * <exception-type>java.lang.Exception</exception-type> in the web.xml
// */
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}
未捕获WebApplicationException,并显示默认的jetty 401错误页面:
HTTP错误401
访问/ v1 / locations / throwError时出现问题。原因是:
UNAUTHORIZED Powered by Jetty
注册
<error-page>
<error-code>401</error-code>
<location>/showerror</location>
</error-page>
不起作用,但它适用于404错误..
有人知道为什么会这样吗?我需要捕获ErrorHandlerServlet的所有错误,将它们转换为json错误消息。
答案 0 :(得分:0)
我认为泽西岛正在重视Jetty的行为,所以它没有取决于XML的价值。解决问题的一种方法(也许不是最优雅的):
@Context HttpServletResponse res;
@GET
@Produces(MediaType.TEXT_HTML)
public String doFoo(){
try {
//Code that causes the error
} catch (Exception e) {
res.sendRedirect("/showError");
}
return "";
}
另一个想法是扩展WebApplicationException并自己管理响应(可能是最好的)