1

FullAjacExceptionHandler は、javax.el.E​​LException または java.lang.Throwable のみをキャッチできます。また、Throwable は javax.el.E​​LException よりも優先されます。マネージド 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 をゼ​​ロにすることはできません。

4

1 に答える 1

0

FullAjaxExceptionHandler根本原因を明らかにするだけですFacesException。ただし、MyFacesはのContextAwareELExceptionサブクラスではなく、のサブクラスであるFacesExceptionため、ELExceptionアンラップされたままになります。

OmniFacesの第149号に従って、FullAjaxExceptionHandlerアンラップも改善されELExceptionています。これは、OmniFaces1.4以降で使用できます。

于 2013-03-13T19:23:39.177 に答える