ステートフルバッキングBeanで使用するスコープについて少し混乱しています。現在、JSFを介してユーザーの結果をxhtmlページに配信するBeanがあり、Beanはデフォルト(会話スコープ)を使用し、@Createメソッドは@とマークされています。 Begin(join = true)....これにより、Beanは現在実行中の会話に参加できるようになりますよね?
しかし、私が見つけたのは、ユーザーが別のページに移動してから再び戻ったときに、@CreateメソッドがバッキングBeanで再度呼び出されていることです。これは避けたいです。
私が見つけたこれを回避する唯一の方法は、Beanを@Scope(ScopeType.SESSION)としてマークすることです。これにより、ユーザーのログインセッションの存続期間中(予想どおり)Beanが維持されます。
しかし、SEAMのドキュメントで、このようにセッションスコープのバッキングBeanを使用するのは悪い習慣であると何度か読んだことがあります...私の質問は、ページがリロードされるたびに会話型スコープのBeanがリセットされないようにするにはどうすればよいですか...会話の範囲について基本的なことが欠けているような気がしますか??!誰かが私を教えてくれますか
問題のBeanの編集バージョンを以下に含めました...
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("sessionActions")
@Restrict("#{identity.isLoggedIn()}")
public class SessionActionsBean implements SessionActions, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Logger private Log log;
@RequestParameter private String sId;
@In Redirect redirect;
@In private MessagePoster messagePoster;
@In private Map<String, String> messages;
@Create
@Begin(join=true)
@Override
public void create(){
log.debug("bean is being created")
}
//--------------------------- Cleanup methods
@Remove
@BypassInterceptors
@Override
public void cleanUp(){}
}