問題
下記のようなコードがあったとして、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で会話スコープを終わらせつつ自画面に遷移 – じゃばらの手記