[Seasar-user:15959] Re: [Teeda]SingletonS2Container#getComponentでClassCastException

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 10月 9日 (木) 19:30:40 JST


小林 (koichik) です.

Date:    Thu,  9 Oct 2008 18:17:31 +0900
From:    [E-MAIL ADDRESS DELETED]
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15958] [Teeda]SingletonS2Container#getComponentでClassCastException

> HotDeployでアプリケーション起動後1回目だけ
>  SingletonS2Container.getComponent(LoginDto.class)
> の実行時にClassCastExceptionが発生することがあり、
> 困っています。2回目以降は問題ないです。

getComponent(LoginDto.class) しているインターセプタが
dicon に定義されているか,HOT deploy の対象ではない 
(ルートパッケージ以下ではない) のではないでしょうか?

その場合,インターセプタは HOT の対象ではないため,
LoginDto.class で参照するクラスも HOT の対象ではない
クラスになります.
同じクラスファイルからロードされても,クラスローダが
異なると別のクラスとして扱われ,代入することも
できないので ClassCastException が発生します.
一度インターセプタが LoginDto をロードすると,
次のリクエストでは LoginDto が HOT の対象では
なくなるため,ClassCastException が発生しなく
なります.


対策としては,インターセプタも HOT の対象にして,
getComponent() するのではなく,Dto を DI して
もらうのが簡単です.

そのため,インターセプタはシングルトンではなく,
プロトタイプにする必要があります.
HOT (というか SMART) deploy ではインターセプタは
デフォルトでプロトタイプになるので,アノテーション
等で指定していなければそのままでプロトタイプに
なります.

インターセプタを <root>.interceptor に配置して,
dicon に定義しないようにします.
設定が必要なら設定を保持する Dto または Map 等を
dicon に定義してインターセプタに DI されるように
します.
シングルトンの情報が必要な場合も同様です.

customizer.dicon の pageCustomizer で
インターセプタを指定する際に useLookupAdapter を
有効にします.

<component name="pageCustomizer" class="...">
  <initMethod name="addAspectCustomizer">
    <arg>"xxxInterceptor"</arg>
    <arg>true</arg><!-- useLookupAdapter -->
  </initMethod>
  ...
</component>

ポイントカットを指定するなら

<component name="pageCustomizer" class="...">
  <initMethod name="addAspectCustomizer">
    <arg>"xxxInterceptor"</arg>
    <arg>"prerender|initialize|do.*"</arg>
    <arg>true</arg><!-- useLookupAdapter -->
  </initMethod>
  ...
</component>

ドキュメント「DIContainer」−「カスタマイザ設定例」

http://s2container.seasar.org/2.4/ja/DIContainer.html#CustomizerConfigExample

の「インスタンス属性が singleton以外の
インターセプタを利用する」および,FAQ の
「アスペクト (インターセプタ) を singleton 以外に
することはできますか?」の「Seasar2.4.10 以降で 
SMART deploy を使う場合」

http://www.seasar.org/wiki/index.php?FAQ%2FS2AOP#q69751d4

も参照してください.


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