如何在JSF 1.2 / Mojarra中吞下异常

时间:2011-11-10 15:43:30

标签: java jsf java-ee jsf-1.2 mojarra

ViewExpiredException正在通过重定向到登录屏幕来处理。问题是仍然记录了异常,并且客户非常希望server.log无异常。

虽然在这种情况下可能是一个值得怀疑的要求,但我仍然要做到这一点。我们使用Mojarra并在JBoss EAP 5.1上部署

MyFaces approach无效,因为我显然无法使用Mojarra包裹MyFacesServlet

我无法应用JBoss JSF guide中给出的建议来包装Faces servlet,因为我无法在任何地方找到jsf-integration-deployer-jboss-beans.xml

我也无法让approach proposed by Ed Burns工作。我想原因是它针对的是JSF2因为我在我的罐子里找不到javax.faces.context.ExceptionHandlerFactory

更糟糕的是,我对JSF很陌生,所以我必须依赖详细的指导,寻找我已经找到上述方法但未能应用它们。

谢谢

2 个答案:

答案 0 :(得分:3)

那篇文章确实是针对JSF 2.x. JSF 1.x没有任何异常处理工具。

只需捕获并重定向自己,而不是让容器执行此操作。过滤器是一个明智的地方:

try {
    chain.doFilter(request, response);
} catch (ServletException e) {
    if (e.getRootCause() instanceof ViewExpiredException) {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(req.getContextPath() + "/errors/session-expired.jsf");
    } else {
        throw e;
    }
}

将此web.xml映射到FacesServlet的servlet名称上以使其运行。

答案 1 :(得分:1)

我在JSF 2.0中遇到了同样的问题,该实现由IBM Websphere 8.5.5.3提供。

我尝试使用ExceptionHandlerWrapper检查ViewExpiredException和 重定向到会话过期页面(或登录页面),但是我无法使以下错误消失,可惜此错误在处理程序之前打印:

StateUtils E View State cannot be reconstructed

但是我想通过实现一个servlet过滤器来解决该问题,该过滤器将检查任何潜在的ViewExpiredException,并将其重定向到会话过期页面(如果有)。

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

HttpSession session = request.getSession(false);

boolean requestContainsViewState = (request.getParameter("javax.faces.ViewState") != null);
boolean potentialViewExpiredException = (session == null && requestContainsViewState);
if (potentialViewExpiredException) {
    // No session found and potential ViewExpiredException, redirect to session expired page.
    response.sendRedirect(request.getContextPath() + "/pages/error/expired.xhtml");
} else {
    chain.doFilter(req, res);
}

编辑:您需要确保这是过滤器链中的第一个过滤器,如果有以前的过滤器并且此过滤器创建了会话,则上述解决方案将对您不起作用。