FullAjacExceptionHandler は、javax.el.ELException または java.lang.Throwable のみをキャッチできます。また、Throwable は javax.el.ELException よりも優先されます。マネージド Bean によってスローされた特定の例外を明示的にキャッチする必要があります。ただし、ELException は明らかに根本原因の例外 (つまり、LoginFailedException) をラップします。
私は JSF 2 (MyFaces 2.1.10)、Spring EL リゾルバー (Spring マネージド Bean)、el-api-2.2、glassfish el-impl-2.2 を使用しています。
エラーは次のとおりです。
Ajax request: No
Status code: 500
Exception type: class org.apache.myfaces.view.facelets.el.ContextAwareELException
Exception message: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed.
Stack trace: org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: org.tests.omnifaces.exception.LoginFailedException: Login failed.
...
LoginFailedException は単純なカスタム例外です。助けていただければ幸いです。前もって感謝します。
編集:実験が行われました:
LoginFailedException がスローされたときに呼び出される/使用されるエラー ページを確認するために、3 つのエラー ページを作成しました。XHTML エラー ページには、どれがどれであるかを識別するヘッダー文字列を除いて、まったく同じコードが含まれています。web.xml エラー エントリは次のとおりです。
<error-page>
<exception-type>org.tests.omnifaces.exception.LoginFailedException</exception-type>
<location>/pages/errors/loginError.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.el.ELException</exception-type>
<location>/pages/errors/elException.xhtml</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/pages/errors/catchAllThrowable.xhtml</location>
</error-page>
catchAllThrowable.xhtml が使用されます。私が(web.xmlでコメントアウト)Throwableを削除すると、ELException.xhtmlが使用されます。ELException を削除すると、例外は loginError.xhtml ではなくコンテナー (tomcat) によって処理されます。
これで私のケースが明確になることを願っています。
アップデート:
私は現在、AJAX呼び出しを使用してフォームを送信しています(これがハンドラーの目的であると思います)。web.xmlで3つのエラーハンドラーページすべてがアクティブになっています(Throwable、ELException、LoginFailedException):
<h:commandButton id="loginButton" value="Login" action="#{login.loginUser}">
<f:ajax execute="@form" render="@form messages" />
</h:commandButton>
Throwable はスキップされ、ELException が一致しました (elException.xhtml がレンダリングされました)。まだ LoginFailedException をゼロにすることはできません。