我使用FullAjaxExceptionHandlerFactory
处理ajax和非ajax请求期间的异常。
FullAjaxExceptionHandler
将透明地处理ajax请求期间的异常,与处理同步(非ajax)请求中的异常的方式完全相同。
我注意到,如果在同步请求期间发生异常,则不会调用findExceptionRootCause
(实际上是解包的方法)。因此,web.xml
中定义的规则由于要依靠FullAjaxExceptionHandler
展开而没有应用。
这是否意味着我需要扩展FullAjaxExceptionHandler
还是我缺少什么?
(非ajax请求)
javax.servlet.ServletException:
Caused by: javax.faces.view.facelets.TagAttributeException
Caused by: javax.el.ELException
Caused by: xxx.MyException
<context-param>
<param-name>org.omnifaces.EXCEPTION_TYPES_TO_UNWRAP</param-name>
<param-value>javax.servlet.ServletException,javax.faces.view.facelets.TagAttributeException,javax.el.ELException</param-value>
</context-param>
...
<error-page>
<exception-type>xxx.MyException</exception-type>
<location>/xxx/page-not-found.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/xxx/internal-server-error.xhtml</location>
</error-page>
*我记得ELException
可能会省略,因为无论如何它都会被包含在内。为了确定起见,我在堆栈跟踪中将所有类型都包含在异常之前。
/xxx/internal-server-error.xhtml
/xxx/page-not-found.xhtml
对于上述例外情况,如果我像这样定义<error-page>
<error-page>
<exception-type>javax.faces.view.facelets.TagAttributeException</exception-type>
<location>/blueglue/templates/error/page-not-found.xhtml</location>
</error-page>
或
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/blueglue/templates/error/page-not-found.xhtml</location>
</error-page>
我会得到预期的结果-404页。
对于javax.el.ELException
和xxx.MyException
,异常导致出现500页,这不是我期望的。
答案 0 :(得分:1)
我使用
FullAjaxExceptionHandler
处理ajax和非ajax请求期间的异常。
FullAjaxExceptionHandler
在非ajax请求期间不会不处理异常。它的唯一目的是在ajax请求期间以与非ajax请求相同的方式处理异常(即,显示在web.xml
中定义的错误页面)。
在您链接的展示页面上,您可以找到以下部分:
常规请求
请注意,
FullAjaxExceptionHandler
根本不处理正常的(非ajax)请求。为了正确处理普通请求的JSF和EL异常,您还需要一个附加的FacesExceptionFilter
。这将从包裹的FacesException
和ELException
中提取根本原因,然后再将ServletException
委托给容器(容器将使用ServletException
的第一个根本原因进行匹配web.xml
中出现异常错误页面。
因此,您所需要做的就是安装FacesExceptionFilter
,以获得与FullAjaxExceptionHandler
相同的展开行为。