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 回答