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