web.xml中的条件错误页面/跳过Jersey的错误页面

时间:2012-11-02 11:01:28

标签: java jersey web.xml

我有一个同时使用JSF和Jersey的Web应用程序:

/contextpath/rest/whatever -> Jersey
/contextpath/everythingelse -> JSF

如果JSF中发生错误,即500内部服务器错误,则由于web.xml中的配置而显示错误页面

...
<error-page>
   <error-code>403</error-code>
   <location>forbidden.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/path/to/errorhandler.jsp</location>
</error-page>

这在“JSF-land”中按预期工作。但是,如果Jersey资源抛出异常:

  1. ExceptionMapper(Jersey)处理异常,
  2. 发送错误回复(例如403禁止)
  3. 由于它是在web.xml中定义的,因此将提供forbidden.jsp页面
  4. 这会产生不良的副作用,即调用forbidden.jsp并将HTML返回给客户端,要求提供application / json。我的第一个问题是有条件地编写错误页面语句,因此它们只会启动非休息资源,但这似乎不可能。

    其他建议?

1 个答案:

答案 0 :(得分:0)

因此,如果8年后仍然有人遇到此问题(是的,我也不为此感到骄傲...),这就是我解决的方法:

向web.xml添加了一个针对servlet的错误页面:

<error-page>
    <error-code>403</error-code>
    <location>/403Handler</location>
</error-page>

创建了403Handler servlet:

@WebServlet("/403Handler")
public class 403Handler extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    processError(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    processError(request, response);
}

private void processError(HttpServletRequest request, HttpServletResponse response) {
    Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
    if (statusCode != 403) {
        return;
    }

    String originalUrl = (String) request.getAttribute("javax.servlet.error.request_uri");
    if (StringUtils.startsWith(originalUrl, "contextpath/rest")) {
        return;
    }

    try {
        request.getRequestDispatcher("/path/to/errorhandler.jsp").forward(request, response);
    } catch (ServletException | IOException e) {
        log.error("failed to foward to error handler", e);
    }
}