2009-07-31 16 views
2

Struts2でエラー処理を行う方法について少し混乱します。私はエラーが発生した場合にユーザーが指示される中央ページを一度作成したいと思う。エラーが発生したとき、私は、エラーをキャッチした場合、私は私のアクションクラスで、Struts2でのエラー処理

しかしlog.error(e.getMessage(), e);としてそれをログに記録することがあります私はlog4jのを使用していますので、私は、それを記録したい(のtry/catch内のすべての私のコードを入れて)中央/共通エラーページが表示されません。だから私はエラーをキャッチすることに決めた、私はエラーをキャッチしていない場合は、中央のエラーページが表示されます。しかし今、どうすればエラーメッセージ/ stacktrackをログに記録するのですか?

このlink を読んだ後、私は次のようでした:

<global-results> 
        <result name="Exception" type="chain"> 
         <param name="actionName">ErrorPage</param> 
        <param name="namespace">/error</param> 

        </result> 
      </global-results> 

      <global-exception-mappings> 
       <exception-mapping exception="java.lang.Exception" result="Exception"/> 
      </global-exception-mappings> 
      <action name="selectionPage" class="reports.ReportSelection"> 
       <result>/reports/SelectionPage.jsp</result> 
      </action> 

    </package> 
    <package name="secure" namespace="/error"> 
     <action name="ErrorPage" class="com.myErrorClass"> 
      <result>errorpage.jsp</result> 
     </action> 
    </package> 

以上の構成によれば、本来はエラーがreports.ReportSelectionにスローされます(しかし、私はそこにそれをキャッチしておりません)ので、最終的にコントロールが来ますcom.myErrorClassに設定します。私はこのクラスのエラーを記録することができますが、私の質問は、ログメッセージがまだ利用可能かどうかです...レポートで最初にスローされたからです。

答えて

1

あなたがそれを捕まえてログした後、あなたはそれをretrhowしていますか? 。指定した場合、フレームワークの例外管理は、あなたのエラー処理コードのようなものになるはずでキックする必要がありますあなたは、ロギングのあなたの簡略化されたアプローチに戻ることができるはずの場所でそれと

catch (Exception e) { 
    log.error(e.getMessage(), e); 
    throw e; 
} 

をし、それをretrhowingアクション・クラス、および単一のグローバル・エラー・ページの構成が含まれます。

6

アクションがスローするエラーを記録する方法は次のとおりです。なぜこれがデフォルトでオンになっていないのか分かりません。これをあなたのstruts.xmlファイルに入れてください。

<interceptors> 
     <interceptor-stack name="errorloggingStack"> 
      <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
     </interceptor-ref> 
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="errorloggingStack"/> 

すべての操作方法でtry-catchブロックを使用する必要はありません。代替案として

0

、あなたはまた、defaultStackインターセプタスタックを "上書き" することができます

<interceptors> 
    <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="defaultStack"/> 
     <interceptor-ref name="exception"> 
      <param name="logEnabled">true</param> 
      <param name="logLevel">WARN</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</interceptors>