[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 メーリングリストの案内