13. エラー処理

エラーの処理では個別のActionごとで処理するエラーと、共通でエラー画面を出す場合があると思いますが、
個別のエラー処理はAction内でやるとして、Actionでcatchしなかった例外が発生した場合に共通のエラー画面を出す方法を紹介します。

xwork.xml(global-results)

global-resultsに共通のエラー画面を追加します。

<global-results>
   <result name="error" type="dispatcher">/WEB-INF/vm/error.vm</result>
</global-results>

Interceptorの作成

例外が発生した場合にエラー画面を表示させるInterceptorです。

public class ExceptionHandleInterceptor extends AroundInterceptor {
    protected void before(ActionInvocation actionInvocation) {
    }

    protected void after(ActionInvocation actionInvocation, String result) {
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {
        try {
            return super.intercept(actionInvocation);
        }
        catch (Exception e) {
            return Action.ERROR;
        }
    }
}

xwork.xml(Interceptor)

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
     "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
    <include file="webwork-default.xml"/>
    <interceptor name="exception-handle" 
        class="ww2.example.aop.ExceptionHandleInterceptor" />
    <interceptor-stack name="exceptionHandleDefaultStack">
        <interceptor-ref name="exception-handle"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>

    <package name="default" extends="webwork-default">
        <default-interceptor-ref name="errorHandleDefaultStack"/>
    </package>
</xwork>

結果

Actionから例外が投げられると、/WEB-INF/vm/error.vmの内容が表示されます。