JSF中未捕获的异常处理

时间:2013-05-21 17:07:52

标签: jsf-2 exception-handling

我正在尝试创建一个过滤器来处理异常(请参阅Handling Uncaught Exception in JSF

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      try {
          log.info("check filter is running");
            chain.doFilter(request, response);
        } catch (Exception e) {
            log.error("Uncaught exception",e);
            request.setAttribute("exception", e);
            request.getRequestDispatcher("/error.xhtml").forward(request, response);
        }
}

我执行以下方法:

    <p:commandButton value="Dispatch Order" update="@form"
        action="#{orderBean.dispatchOrder()}">
    </p:commandButton>

但是,没有处理任何例外。

我在日志中看到错误:

May 21, 2013 6:04:32 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
WARNING: #{orderBean.dispatchOrder()}: MyException.....

我做错了什么?

2 个答案:

答案 0 :(得分:3)

这个旧问题针对JSF 1.x,当您发送JSF 2.x ajax请求时,答案不适用。只有在ajax="false"添加<p:commandButton>或使用不带<h:commandButton>的标准JSF <f:ajax>时,才会调用您的过滤器。为了处理ajax请求的异常,您需要一个自定义ExceptionHandler

另见:

答案 1 :(得分:0)

这不是JSF 2.0中的最佳实践。相反,请看:http://javalabor.blogspot.se/2011/09/jsf-2-global-exception-handling.html

现在您可能会在评论中跟随Solder / Seam 3背后的一些人推荐Seam Catch。 Seam Catch实际上使用相同的原则,但采用更精确的方式。当然这是CDI做事的方式,考虑到你应该做CDI imo的JSF2 Beans的预弃弃警告。

Seam Catch已经移植到Deltaspike Core但是JSF集成没有削减0.4所以你必须自己实现它,然后你可以在deltaspike中实现后替换你的实现。 Jira在这里:https://issues.apache.org/jira/browse/DELTASPIKE-341

来自Seam Catch的这段源代码将带您走很远https://gist.github.com/mojavelinux/734963。但是你应该像这样得到BeanManager:

    BeanManager beanManager = BeanManagerProvider.getInstance()
            .getBeanManager();

    beanManager.fireEvent(catchEvent);

以下是您需要做的总结:

  1. 去CDI
  2. 将Deltaspike Core添加到类路径
  3. 根据我发布的改编,从Seam的源代码中实现您自己的ExceptionHandler等。
  4. 利润!!!现在,您可以使用Deltaspike的异常控制以非常流畅的方式捕获未捕获的异常。有关如何实施捕获的详细信息,请参阅此处:http://incubator.apache.org/deltaspike/core.html#exception-control
  5. 编辑:BalusC的建议是一个很好的轻量级候选人,它也有这种风格:http://fractalsoft.net/primeext-showcase-mojarra/views/ajaxErrorHandler.jsf