これは、JSF仕様に従ってViewExpiredException
がラップされているためです。これは、JSF1.2仕様ServletException
の第10.2.6.2章の抜粋です。
10.2.6.2 FacesServlet
execute()
保存されたインスタンスのメソッドを呼び出し、このリクエストLifecycle
のインスタンスをパラメータとして渡し
ます。メソッドがをスローするFacesContext
場合は、ルート原因としてを使用して
再スローします。execute()
FacesException
ServletException
FacesException
エラーページの割り当て方法は、サーブレットAPI仕様で指定されています。これは、サーブレットAPI仕様2.5の9.9.2章の抜粋です。
SRV.9.9.2エラーページ
class-hierarchy matchを使用し
た近似を含む宣言がなく 、スローされた例外がそのサブクラスである場合、コンテナはメソッドで定義されているように、ラップされた例外を抽出します。エラーページ宣言に対して2回目のパスが行われ、エラーページ宣言との一致が再度試行されますが、代わりにラップされた例外が使用されます。error-page
exception-type
ServletException
ServletException.getRootCause
クラス階層では、はServletException
すでに一致Throwable
しているため、その根本原因は2回目のパスでは抽出されません。
この指定された動作を証明するには、 asに置き換えjavax.faces.application.ViewExpiredException
て再試行します。予想されるエラーページが表示されます。javax.servlet.ServletException
<exception-type>
これを解決するには、またはのエラーページを削除するだけです。例外固有のエラーページが1つも一致しない場合は、とにかくエラーコードのページにフォールバックします。したがって、必要なのはこれだけです。java.lang.Throwable
java.lang.Exception
500
<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に戻り、コマンドボタンを押します(事前にページをリロードせずに!)。