JavaEE缺省错误处理程序servlet不捕获抛出的错误

时间:2012-05-22 12:38:51

标签: google-app-engine exception java-ee error-handling jersey

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

1 个答案:

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