[Seasar-user:5916] Re: [Teeda]ThrowsInterceptorでthrowした例外が初回はcatchできない(hotdeploy)
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 1月 26日 (金) 15:00:16 JST
小林 (koichik) です.
Date: Fri, 26 Jan 2007 13:25:10 +0900
From: Asarima <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:5914] Re: [Teeda]ThrowsInterceptorでthrowした例外が初回はcatchできない(hotdeploy)
> 次に、DaoにASPECTアノテーションを書いてみましたが、やはりcatchできま
> せんでした。HotClassLoaderがコンポーネントをロードしたことはログを見て
> 分かりましたが、何故catchできないかはわかりませんでした。
Dao のアノテーションで指定したインターセプタは,
customizer.dicon で指定したインターセプタよりも
内側に設定されます.
dicon でいうと次のイメージになります.
<component class="...Dao">
<aspect>dao.interceptor</aspect>
<aspect>throwsInterceptor</aspect>
</component>
このため,S2Dao のインターセプタがスローした例外を
ThrowsInterceptor がキャッチすることはありません.
というか,ThrowsInterceptor は呼び出されません.
やり方としては,ThrowsInterceptor も customizier.dicon で
設定する方がいいと思います.
[Seasar-user:5896] の app_aop.dicon の定義を削除して,
customizer.dicon の oracleCustomizer の定義を
<component name="oracleCustomizer"
class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">
"oracleSQLExceptionThrowsInterceptor"
</property>
</component>
に変更すれば問題ないように見えます.
# 変更したのは <property> の中だけです.
OracleSQLExceptionThrowsInterceptor がルートパッケージ下の
interceptor パッケージにあれば,dicon に登録しなくても
名前で利用することができます.
> ここまで書いて気が付いたのですが、koichikさんはThrowsInterceptorを
> 本来のクラスローダーに予めロードするように書かれていたので、私のとっ
> た方法はあまりよろしくないのかも知れませんね。もう少し考えます。
[Seasar-user:5893] で書いたのはその通りですが,
[Seasar-user:5894] で書いたのは ThrowsInterceptor も
HOT のクラスローダーでロードする方法です.
なので,Asarima さんのやり方で問題ないと思います.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内