[Seasar-user:16009] Re: [Teeda]SingletonS2Container#getComponentでClassCastException
[E-MAIL ADDRESS DELETED]
[E-MAIL ADDRESS DELETED]
2008年 10月 16日 (木) 18:12:04 JST
海野です。
ご指摘の通り、インターセプタをPageカスタマイザに
useLookupAdapter=true
で登録し、diconから定義を削除したところ、
ClassCastExceptionは発生しなくなりました。
ただ、
> > 設定が必要なら設定を保持する Dto または Map 等を
> > dicon に定義してインターセプタに DI されるように
> > します.
の「設定が必要なら」という意味がわからなかったため
LoginDtoは<root>.dtoパッケージに配置し、
@Component(instance = InstanceType.SESSION)を設定していて、
diconには登録していません。
ここで新たな問題が発生しました。
ログイン時に、サービスにDIしたLoginDtoに内容を
セットしているのですが、その後PageにDIすると
LoginDtoの内容がいつの間にか
全てnullになってしまうことがあります。
LoginDtoクラス自体はDIされてnullではなく
内容が存在したときのハッシュ値
(デバッガで見た[E-MAIL ADDRESS DELETED]というような値)
と、なくなっているときのLoginDtoのハッシュ値は同じでした。
内容だけがnullになってしまっています。
プログラムでは、内容をクリアするコーディング
をしている箇所はありません。
どのタイミングでnullになるのかが分からず困っています。
解決のためのアドバイスをいただけませんでしょうか。
宜しくお願い致します。
引用 [E-MAIL ADDRESS DELETED]:
> 小林さん
>
> 大変丁寧なご回答をいただきまして、感謝致します。
> 意味はよくわかりました。検証してみます。
> ありがとうございました。
>
> 海野
>
>
> 引用 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内