Facelets 错误页面在使用 FullAjaxExceptionHandler 的 ajax 请求期间有效,但在同步请求期间不评估 EL

Facelets error page works during ajax request with FullAjaxExceptionHandler, but does not evaluate EL during synchronous request

我正在尝试使用 Omnifaces 库配置一个普通的(非 ajax)请求错误页面。我能够使用 FullAjaxExceptionHandler 和 ajax 请求错误及其页面,如演示中所示。当我使用与正常请求相同的错误页面时,会显示错误页面,但值显示为源代码(例如 Date/time: #{of:formatDate(now, 'yyyy-MM-dd HH:mm:ss')} 用户代理: #{header['user-agent']} .. 原样显示在浏览器中。

我正在使用 Tomcat 7、JSF 2.2 (MyFaces)、Weld 2.6(用于 CDI)、Omnifaces 2.0 和 Primefaces 5.1。以下是相关代码。

页面:

<h:commandButton value="Throw runtime exception on normal request"      
    action="#{appbean.throwRuntimeException}"/>

<p:commandButton value="Throw runtime exception on AJAX request"        
    action="#{appbean.throwRuntimeException}"/>

豆子:

public void throwRuntimeException() {
        throw new RuntimeException("peek-a-boo");
}

面孔配置:

<factory>
    <exception-handler-factory>
        org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory  
    </exception-handler-factory>
</factory>

web.xml:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
    <filter-name>facesExceptionFilter</filter-name>
    <filter-class>org.omnifaces.filter.FacesExceptionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>facesExceptionFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<error-page>
    <exception-type>java.lang.RuntimeException</exception-type>
    <location>/WEB-INF/errorpages/error2.xhtml</location>
</error-page>

<error-page><location> 必须匹配 FacesServlet 映射,以便在同步请求异常期间也能在错误页面上获得 FacesServlet 到 运行(这不会不要使用 ViewHandler#renderView(), but RequestDispatcher#forward()).

相应地更改映射:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

使用 /faces/*(和 *.faces)是 soo JSF 1.0/1.1。如果您出于某种原因确实需要保留 /faces/*(例如,具有已发布 URL 的现有 Web 应用程序),则只需同时使用两者(并相应地使用 301 进行迁移):

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

另请参阅:

  • JSF returns blank/unparsed page with plain/raw XHTML/XML/EL source instead of rendered HTML output