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つのクラスで共存できそうですね。