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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2008年 10月 11日 (土) 09:32:13 JST


小林さん

大変丁寧なご回答をいただきまして、感謝致します。
意味はよくわかりました。検証してみます。
ありがとうございました。

海野


引用 Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>:

> 小林 (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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 




Seasar-user メーリングリストの案内