ConversationScopedはスコープを抜けてもメンバ変数は初期化されない。

問題

下記のようなコードがあったとして、BooBooクラスのスコープを抜けたら(startConversationを呼んだ後、endConversationを呼んでリダイレクトすると、)リダイレクト先のbooBoo.memはどうなるかという問題。

	// Bean側
	private String mem = "My name is Default_Boo.";
	public String startConversation(){
		//会話が開始していない
		if(conversation.isTransient()) {
			conversation.begin();
		}
		mem = "My name is Changed_Boo.";
		return REDIRECT_URL;
	}
	
	public String endConversation(){
		//会話が開始している
		if(!conversation.isTransient()) {
			conversation.end();
		}
		conversation.begin();
		//名前はデフォルトに戻っているはず…
		return REDIRECT_URL;
	}
<!-- リダイレクト先 -->
<h:outputText value="#{booBoo.mem}" />

正解

当然ですが名前はデフォルトに戻らないです。ちゃんと初期化しましょうという話でした。ていうかそもそもこんなコード書いちゃダメじゃねって気がしますが、どうなんでしょう。書いたのが自分じゃないので何とも言えない。

この記事書いてから下記の記事を見つけました。会話終了後に一旦リダイレクトするのはたしかにスマート、というか本来こうすべきなのでしょうね。
JSFで会話スコープを終わらせつつ自画面に遷移 – じゃばらの手記

コメントを残す

お手数ですが半角数字で計算結果を入力してください。 *