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