質問
Struts2でエラー処理を行う方法について少し混乱しています。エラーが発生した場合にユーザーを誘導するための中心的なページを一度作成したいと思います。さらに、エラーが発生した場合、log4jを使用しているため、 log.error(e.getMessage()、e);
ただし、アクションクラスでエラーをキャッチすると(すべてのコードをtry / catchに入れる)、中央/共通エラーページが表示されません。だから私はエラーをキャッチすることを決めた、私はエラーをキャッチしていない場合、中央のエラーページが表示されます。しかし、今、エラーメッセージ/スタックトラックをログに入れるにはどうすればよいですか?
このリンクを読んだ後 私は次のことをしました:
<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になります。このクラスでエラーをログに記録することはできますが、私の質問は、ログメッセージがまだレポートにスローされているため、ログメッセージがまだ利用可能かどうかです。
解決
キャッチしてログに記録した後、再試行しますか?その場合、フレームワークの例外管理が開始されます。エラー処理コードは次のようになります。
catch (Exception e) {
log.error(e.getMessage(), e);
throw e;
}
これを設定すると、アクションクラスでのロギングと再試行、および単一のグローバルエラーページの設定という単純化されたアプローチに戻ることができます。
他のヒント
ここに、アクションがスローしたエラーを記録する方法を示します。これがデフォルトで有効になっていない理由はわかりません。これを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ブロックで囲む必要はありません。
別の方法として、「上書き」することもできます。 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>