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
ここによると、電力の事か。