0

我的问题是我注册的错误处理程序代码不适用于所有错误。在我的 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 错误消息。

4

1 回答 1

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 并自己管理响应(可能是最好的)

于 2012-05-23T13:50:49.027 回答