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

时间:2015-06-09 08:12:50

标签: jsf error-handling web.xml omnifaces

我正在尝试使用Omnifaces库配置普通(非ajax)请求错误页面。我可以使用FullAjaxExceptionHandler和ajax请求错误及其页面,如演示中所示。当我使用与正常请求相同的错误页面时,会显示错误页面,但值显示为源代码(例如日期/时间:#{of:formatDate(现在,' 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>

1 个答案:

答案 0 :(得分:2)

<error-page><location>必须与FacesServlet映射匹配,才能在同步请求(不使用{的异常期间)在错误页面上运行FacesServlet {3}},但ViewHandler#renderView())。

相应地改变映射:

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

使用/faces/*(和*.faces)是soo JSF 1.0 / 1.1。如果您出于某种原因确实需要保留/faces/*(例如现有的已发布网址的网络广告),那么只需使用两者(并相应地迁移301s):

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

另见: