質問

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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top