18

ビューの有効期限が切れた場合に「セッション期限切れ」ページを表示する必要がある JSF Web アプリケーションに取り組んでいますが、他のすべての一般的な技術エラー ページです。例外をトリガーしたときにのみ、アプリケーションは技術エラー ページに移動します。エラーページの定義は次のとおりです。

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/jsps/utility/sessionExpired.jsp</location> 
</error-page> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/jsps/utility/technicalError.jsp</location> 
</error-page> 
<error-page>
    <error-code>500</error-code>
    <location>/jsps/utility/technicalError.jsp</location>
</error-page>

technicalError.jsp エラー ページ要素を削除したところ正常に動作しましたが、それらを元に戻すと、sessionExpired.jsp ページにアクセスできません。適切なページが表示されるように、これらのタグを評価する順序を Web コンテナーに伝えるにはどうすればよいですか? ありがとう。

4

2 に答える 2

17

これは、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は次のとおりです。

  1. 簡単なコマンドボタンを使用してJSFページを作成し、デプロイして実行し、Webブラウザーで開きます。
  2. Eclipseに戻り、Tomcatサーバーを右クリックして、[ Tomcat作業ディレクトリのクリーンアップ]を選択します。これにより Tomcatが再起動し、シリアル化されたすべてのセッションが破棄されます(重要です!Tomcatを再起動するだけでは不十分です)。
  3. webbrowserに戻り、コマンドボタンを押します(事前にページをリロードせずに!)。
于 2010-07-08T21:14:32.430 に答える