セッション・スコープ Bean の transient フィールドが正常にフェイルオーバーできない

この規則により、@SessionScoped のアノテーションが付けられたクラス内の transient 修飾子のあるフィールドにフラグを立てます。Contexts and Dependency Injection (CDI) 1.0 OpenWebBeans 実装では、アプリケーションがセッション・スコープ Bean に直接 transient フィールドを設定できます。CDI 1.2 Weld 実装では、transient フィールドを直接設定しても、フェイルオーバー後にフィールドにデータが取り込まれることにはならず、それが原因でアプリケーションに予期しない動作が起こることがあります。

この規則によりフラグが立てられた各 transient フィールドが、包含するクラスにより提供されるメソッドの使用によってのみ設定されることを確認します。フィールドに set メソッドがない場合は、フィールドを直接設定するのではなく、set メソッドを追加して呼び出します。

以下の例では、UserBean クラスに @SessionScoped のアノテーションが付けられています。そのクラスには、setter メソッドを使用して設定された transient 修飾子のあるフィールドも含まれています。


@Named(value="userBean")
@SessionScoped
public class UserBean implements UserInterface, Serializable
{
	String name;
	transient String nickName;

	...

	public void setNickName(String nick)
	{
	    nickName = nick;
	}
}

Java Platform, Enterprise Edition (Java EE) 7 CDI 1.2 実装について詳しくは、 Contexts and Dependency Injection 1.2 での振る舞いの変更を参照してください。