バージョンと設定
・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"として、各画面で定義するエラー時の遷移先です)