我正在尝试使用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>
答案 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>