これは、JSF仕様に従ってViewExpiredExceptionがラップされているためです。これは、JSF1.2仕様ServletExceptionの第10.2.6.2章の抜粋です。
10.2.6.2 FacesServlet
execute()保存されたインスタンスのメソッドを呼び出し、このリクエストLifecycleのインスタンスをパラメータとして渡し
ます。メソッドがをスローするFacesContext場合は、ルート原因としてを使用して
再スローします。execute()FacesExceptionServletExceptionFacesException
エラーページの割り当て方法は、サーブレットAPI仕様で指定されています。これは、サーブレットAPI仕様2.5の9.9.2章の抜粋です。
SRV.9.9.2エラーページ
class-hierarchy matchを使用し
た近似を含む宣言がなく 、スローされた例外がそのサブクラスである場合、コンテナはメソッドで定義されているように、ラップされた例外を抽出します。エラーページ宣言に対して2回目のパスが行われ、エラーページ宣言との一致が再度試行されますが、代わりにラップされた例外が使用されます。error-pageexception-typeServletExceptionServletException.getRootCause
クラス階層では、はServletExceptionすでに一致Throwableしているため、その根本原因は2回目のパスでは抽出されません。
この指定された動作を証明するには、 asに置き換えjavax.faces.application.ViewExpiredExceptionて再試行します。予想されるエラーページが表示されます。javax.servlet.ServletException<exception-type>
これを解決するには、またはのエラーページを削除するだけです。例外固有のエラーページが1つも一致しない場合は、とにかくエラーコードのページにフォールバックします。したがって、必要なのはこれだけです。java.lang.Throwablejava.lang.Exception500
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/jsps/utility/sessionExpired.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/jsps/utility/technicalError.jsp</location>
</error-page>
更新throw new ViewExpiredException():OPの(削除された)コメントによると:これを確実にテストするために、Beanコンストラクターやメソッドなどでは実行できません。次に、いくつかのEL例外にラップされます。最終的には、にデバッグライン印刷rootCauseを追加しFilterて、自分で確認することができます。
Eclipse / Tomcatを使用している場合、テストする簡単な方法ViewExpiredExceptionは次のとおりです。
- 簡単なコマンドボタンを使用してJSFページを作成し、デプロイして実行し、Webブラウザーで開きます。
- Eclipseに戻り、Tomcatサーバーを右クリックして、[ Tomcat作業ディレクトリのクリーンアップ]を選択します。これにより、 Tomcatが再起動し、シリアル化されたすべてのセッションが破棄されます(重要です!Tomcatを再起動するだけでは不十分です)。
- webbrowserに戻り、コマンドボタンを押します(事前にページをリロードせずに!)。