org.omnifaces.EXCEPTION_TYPES_TO_UNWRAP对非ajax请求不起作用

时间:2019-07-24 14:22:20

标签: ajax jsf omnifaces

我使用FullAjaxExceptionHandlerFactory处理ajax和非ajax请求期间的异常。

The OmniFaces showcase page

  

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

web.xml:

<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.ELExceptionxxx.MyException,异常导致出现500页,这不是我期望的。

1 个答案:

答案 0 :(得分:1)

  

我使用FullAjaxExceptionHandler处理ajax和非ajax请求期间的异常。

FullAjaxExceptionHandler在非ajax请求期间不会处理异常。它的唯一目的是在ajax请求期间以与非ajax请求相同的方式处理异常(即,显示在web.xml中定义的错误页面)。

在您链接的展示页面上,您可以找到以下部分:

  

常规请求

     

请注意,FullAjaxExceptionHandler根本不处理正常的(非ajax)请求。为了正确处理普通请求的JSF和EL异常,您还需要一个附加的FacesExceptionFilter。这将从包裹的FacesExceptionELException中提取根本原因,然后再将ServletException委托给容器(容器将使用ServletException的第一个根本原因进行匹配web.xml中出现异常错误页面。

因此,您所需要做的就是安装FacesExceptionFilter,以获得与FullAjaxExceptionHandler相同的展开行为。