我有一个同时使用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资源抛出异常:
这会产生不良的副作用,即调用forbidden.jsp并将HTML返回给客户端,要求提供application / json。我的第一个问题是有条件地编写错误页面语句,因此它们只会启动非休息资源,但这似乎不可能。
其他建议?
答案 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);
}
}