我在使用Omnifaces的ajax请求上遇到FullAjaxExceptionHandler问题。
我在web.xml中声明了错误页面:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/errorPage.jsf</location>
</error-page>
<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>
我在faces-config.xml
上声明了异常处理程序<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
使用此环境,在非ajax请求的@PostConstruct方法上抛出异常时,错误页面会正确显示。 当我在ajax请求上抛出异常时,错误页面没有显示,但我看到了这条日志消息。
FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/error/errorPage.jsf' will be shown.
过了一会儿,我看到另一条日志消息,浏览器打开“硬编码错误页面”。
FullAjaxExceptionHandler: Well, another exception occurred during rendering error page '/error/erroPage.jsf'. Trying to render a hardcoded error page now.
javax.faces.FacesException: org.apache.jasper.JasperException: /error/errorPage.jspx (line: 11, column: 39) Attribute "xmlns:h" must be declared for element type "html".
似乎JSP正在尝试呈现JSF页面。 如果我将错误页面声明更改为:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/errorPage.jspx</location>
</error-page>
ajax请求正确地重定向到我的页面,但非ajax请求不再重定向到错误页面。
那么,这是配置问题,环境问题还是Omnifaces上的错误?
提前致谢。
答案 0 :(得分:1)
请注意,错误页面必须是有效的Facelets页面!不支持JSP。
来自javadoc:
此异常处理程序将解析web.xml和web-fragment.xml文件,以查找HTTP错误代码500的错误页面位置以及所有声明的特定异常类型。这些位置需要指向Facelets文件(不支持JSP)。
是时候从JSP转换为Facelets了。无论如何,JSP自2009年以来已被弃用。它适用于JSPX扩展,因为它可以被解析为好像它是一个Facelets文件(也是基于XML的)。