S2JSFでダーティリード対応 よん

ピンポェ〜ン。もう画面の事は後回しにしました。頭痛い。まずは例外はLogicで投げようキャンペーンの実施です。まずはActionThrowsInterceptorに施した応急処置のゴミを取って、GOだ。

ダーティリード例外を作ろう

まんず、アプリケーション独自の例外、AppRuntimeExceptionを継承してダーティリード用例外を作りましたよ。

public class DirtyReadRuntimeException extends AppRuntimeException {

    public DirtyReadRuntimeException() {
        super("example.jsf.DirtyRead");
   }
   
}

AppRuntimeExceptionを継承する事で、ActionThrowsInterceptorに拾って貰えるようになる訳です。なんでも拾うようにしちゃうと、致命的なエラーなどで別途エラーページに遷移させたい場合とかに困っちゃいますので。

UpdateFailureRuntimeExceptionを変換する

S2Daoが投げるUpdateFailure〜を、DirtyReadへ変換します。

この変換処理、更新する所では必ず必要となりますんで、いの一番にアスペクト化しましょう。Logicクラス専用のThrowsInterceptorを作ります。

public class LogicThrowsInterceptor extends ThrowsInterceptor {
	
    public void handleThrowable(UpdateFailureRuntimeException ex, 
            MethodInvocation invocation)throws Throwable{
        
        throw new DirtyReadRuntimeException();
    }

}

他にLogicクラス内で変換したい例外を追加する場合は、handleThrowableをオーバーロードしていけばいいのね。簡単ですね。

diconファイルへ登録しましょう

さてこれをdiconファイルへ登録、ついでにInterceptorChainにもつっこみましょう。ああ強調出来ない。ので追加箇所はXMLコメントで書いておきます。と思ったら、はてな側でもコメント扱いしやがった。くそー。ベタで書きます!

<components>
    <include path="aop.dicon"/>
    <include path="j2ee.dicon"/>
    
    <component name="actionThrowsInterceptor" 
        class="example.jsf.interceptor.ActionThrowsInterceptor"/>
        
    ■Logic用のThrowsInterceptorをコンテナに登録■
    <component name="logicThrowsInterceptor" 
        class="example.jsf.interceptor.LogicThrowsInterceptor"/>
    
    <component name="actionInterceptorChain" 
        class="org.seasar.framework.aop.interceptors.InterceptorChain">
        <initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
        <initMethod name="add"><arg>actionThrowsInterceptor</arg></initMethod>
    </component>

    <component name="logicInterceptorChain" 
        class="org.seasar.framework.aop.interceptors.InterceptorChain">
        <initMethod name="add"><arg>aop.traceThrowsInterceptor</arg></initMethod>
        <initMethod name="add"><arg>aop.traceInterceptor</arg></initMethod>
        <initMethod name="add"><arg>j2ee.requiredTx</arg></initMethod>
        ■ そんでもって Chain に追加しときます ■
        <initMethod name="add"><arg>logicThrowsInterceptor</arg></initMethod>
    </component>
</components>

これでいいのか。あっけない。でっきるっかな♪

さてさてほほー実行っ!・・・・。


出来ました。


ちゃんとActionThrowsInterceptorで、AppRuntimeExceptionとしてつかまえてメッセージも出してくれてます。相変わらず登録ボタンは出っ放しだけどな。

アスペクトにしたので、logicInterceptorChainをつっこまれたLogicクラスでは全て、ダーティリード対応出来たぞ。すごいっ、5倍のエネルギーゲインがある!

エネルギーゲインってなんだろう・・・。
http://www.geocities.co.jp/Playtown-Denei/2111/hallo.html
ここによると、電力の事か。