[Seasar-user:10719] Re: [Teeda] 1.0.11-RC2 HOT deploy時 TakeOver.EXCLUDEを使うとNotSerializableExceptionが発生

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 9月 25日 (火) 19:00:30 JST


小林 (koichik) です.

Date:    Tue, 25 Sep 2007 17:33:26 +0900
From:    Junichi Kato <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:10717] [Teeda] 1.0.11-RC2 HOT deploy時 TakeOver.EXCLUDEを使うとNotSerializableExceptionが発生

> Teeda 1.0.11-RC2(SNAPSHOTではない)で,HOT deploy時に,
> TakeOver.EXCLUDEを使うとNotSerializableExceptionが発生します.
> COOL deployでは問題が発生しませんし,TakeOver.INCLUDEでも発生しません.

UserCreditCardBhv も EXCLUDE に含めてください.
そうしないと,UserCreditCardBhv を次画面に
引き継ごうとしてセッションに保持してしまいます.

HOT deploy ではリクエストをまたがると
クラスローダが異なることに対応するため,
セッションからオブジェクトを取得する際に
シリアライズ・デシリアライズを行って,
現在のクラスローダでロードされたクラスの
インスタンスに変換を行います.
そのため,セッションに格納されるオブジェクトが
Serializable を実装していないとすぐに例外に
つながります.

COOL の場合にはこのような現象は起きにくくなりますが,
Web コンテナが (メモリ不足等で) セッション情報を
外部化する場合や,レプリケーションが使われている
場合などは,同じように発生するはずです.

セッションに保持されるオブジェクトは必ず
Serializable にしてください.
Serializable でないオブジェクトはセッションに
保持されないようにしてください.

具体的には,Page に Dao や Dxo,Bhv 等々のフィールドを
持つ場合はそれらのフィールドを transient にして,
SubApplicationScope や RedirectScope は付けない,
TakeOver を使う場合は INCLUDE に含めない,EXCLUDE には
含める,を徹底してください.

> 発生するタイミングは,以下のdoメソッドを抜けた後に発生しています.
> また,UserCreditCardBhvは,当該ページクラスでフィールドとして
> 保持しています.

スタックトレースと説明があってないような?
次画面の表示が始まってから発生してるように
見えます.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




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