1

ステートフルバッキング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(){}

}
4

1 に答える 1

2

そのページに戻ると、おそらく新しい会話があるため、Beanは毎回再作成されます。

会話を開いたままにする必要がある場合は、ナビゲーション中に会話の伝播メカニズムを確認する必要があります。

ただし、ロジックで必要な場合は、毎回Beanを再作成しても問題はありません。パフォーマンスが心配な場合は、適切なプロファイリングを行う前に、オブジェクトの作成について予防的な仮定を行わないでください。

@Createとメソッドが会話よりも広いスコープを持つリソースを管理する場合@Removeは、会話スコープのBeanを、そのリソースを管理する別のセッションスコープのBeanから分離する必要があります。

これは非常に抽象的な推論ですが、役立つことを願っています。

于 2012-05-11T07:42:03.393 に答える