Omnifaces を使用した ajax リクエストで FullAjaxExceptionHandler に問題があります。
- 環境:
- トムキャット 7.0.50
- モハラ 2.1.27
- オムニフェイス 1.7
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 のバグですか?
前もって感謝します。