メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

Struts2のInterceptorでActionエラーハンドリング

バージョンと設定

Tomcat 8.x
Struts 2.3.24.1
struts.xml での struts.enable.DynamicMethodInvocation は true

エラー時は自画面に戻したい

Interceptorが呼べるようになるとやりたくなるのが
ログ書き出し・エラーハンドリング・ログインチェックあたりですね。

エラーハンドリングでよく出てくるのが
struts.xmlにGlobal Exception Handlingか、Action毎にハンドリングを書くかで
そのどちらも
<exception-mapping exception="java.lang.Exception" result="error" />
のような書き方で、Exceptionのタイプが決まってないといけないし
resultがxmlで固定なんですよね。
何よりDynamicMethodInvocationをtrueにしたらxml不要がウリなのに…

だいたいやりたいことって

全てのActionに挟まるInterceptorに独自の処理を施して
その後は自画面の"error"に遷移(戻したい)という場合が
ほとんどではないでしょうか。

Interceptorを実装

CustomExceptionMappingInterceptor extends ExceptionMappingInterceptor
のようにクラスを作成してintercept()を@Overrideします。
実装をこのようにすると望んだ動きになると思います。

try {
    return super.intercept(); // メイン処理の呼び出し
} catch (Throwable t) {
    handleException(t); // エラー時の独自処理をここに実装
    return com.opensymphony.xwork2.Action.ERROR; // "error"
}
return result;

これでメイン処理にtry-catchを挟むことができます。
Exceptionが発生しなければメイン処理で返ってくるStringがそのまま返されて
ここでreturnした画面へ遷移できます。
(ここでは一律"error"として、各画面で定義するエラー時の遷移先です)

 

Interceptorの設定方法は以前紹介しました

ryoichi0102.hatenablog.com