我对我的有状态支持bean使用哪个范围感到有点困惑,我目前有一个bean通过JSF将用户结果传递到xhtml页面,bean使用默认(会话范围)和@Create方法标记为@Begin(join = true)....这应该使bean加入当前长时间运行的对话,对吗?
但我发现,当用户导航到另一个页面,然后再返回时,将在辅助bean上再次调用@Create方法,我想避免使用
我发现的唯一方法是将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(){}
}
答案 0 :(得分:2)
每次都会重新创建bean,因为当你回到那个页面时,你可能会有一个新的对话。
如果您需要保持对话开放,则应在导航过程中查看对话传播机制。
然而,每次重新创建bean都没有错,如果这是逻辑需要的话。如果您担心表演,在进行适当的剖析之前,不要对对象创建做出预防性假设。
如果您的@Create
和@Remove
方法管理范围比会话更广泛的资源,则应将会话范围bean与管理该资源的另一个会话范围bean分开。
这是一个非常抽象的推理,但我希望它可以提供帮助。