2

我正在尝试创建一个过滤器来处理异常(请参阅在 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.....

我究竟做错了什么?

4

2 回答 2

3

那个老问题是针对 JSF 1.x 的,当您发送 JSF 2.x ajax 请求时,答案不适用。只有当您添加ajax="false"<p:commandButton>使用<h:commandButton>不带<f:ajax>. 为了处理 ajax 请求的异常,您需要一个自定义的ExceptionHandler.

也可以看看:

于 2013-05-21T17:26:18.170 回答
0

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

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

Seam Catch 已经被移植到 Deltaspike Core,但是 JSF 集成并没有在 0.4 中实现,所以你必须自己实现它,然后你可以在 deltaspike 中实现它后替换你的实现。吉拉在这里: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

编辑:BalusC 的建议是一个很好的轻量级候选,它也有这种风格: http: //fractalsoft.net/primeext-showcase-mojarra/views/ajaxErrorHandler.jsf

于 2013-05-21T17:34:37.033 回答