我正在尝试创建一个过滤器来处理异常(请参阅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.....
我做错了什么?
答案 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);
以下是您需要做的总结:
编辑:BalusC的建议是一个很好的轻量级候选人,它也有这种风格:http://fractalsoft.net/primeext-showcase-mojarra/views/ajaxErrorHandler.jsf