transient を付けたプロパティ
追記:
以前に以下のようなエントリを書いてしまいましたが、
transient を付けたプロパティは、HOT deployとCOOL deploy で
挙動が違うことが判明したため、使わないこと強くを推奨します。
混乱させてしまって、スミマセン。
挙動から判断するに、HOT deployの時は、HogeDtoをシリアライズ
して何処かに退避しておき、クラスローダが差し替わった後には
シリアライズしたものを使ってHogeDtoを復元しているように思えます。
transient を付けたプロパティは、シリアライズの対象から外れるため、
結果的にセッションスコープではなくなります。
しかし、そもそもCOOL deploy ではシリアライズやクラスローダの差し替えは
行われないので、transient を付けたプロパティもセッションスコープと
なってしまう訳です。
次のエントリのコメント欄でこの記述があります。:
http://d.hatena.ne.jp/cypher256/20080419/p9
id:higayasuo さんのコメントより
ActionFormのプロパティでセッションに格納したくないものは、個別にクリアしなくても、transientをつければOKです。
なっ、なにー。知らなかった。
実際に、以下のようなコードで試してみました。
@Component(instance = InstanceType.SESSION) public class HogeDto implements Serializable { private static final long serialVersionUID = 1L; public Integer arg1; public transient Integer arg2; }
なるほど。確かに、arg2プロパティをセッションスコープとして
アクセスしてみたらNullPointerExceptionになりました。
↑
HOT deployの時のみです。COOL deploy の場合は、値が残ってしまいます。
この場合だと、transient を付けたプロパティは
実質的にリクエストスコープと考えても問題なさそうですね。
今まで、リクエストスコープとセッションスコープのプロパティは
別々のクラスを用意して格納する方針で考えていましたが、
これならば1つのクラスで共存できそうですね。