Java SEAM会话还是会话范围bean?

Java SEAM会话还是会话范围bean?,java,seam,seam2,seam-conversation,Java,Seam,Seam2,Seam Conversation,我对在我的有状态支持bean上使用哪个范围有点困惑,我目前有一个bean通过JSF将用户结果传递到xhtml页面,该bean使用默认的(会话范围),并且@Create方法标记为@Begin(join=true)…这应该使bean加入当前长时间运行的会话,对吗 但我发现,当用户导航到另一个页面,然后再返回时,会在支持bean上再次调用@Create方法,这是我想要避免的 我发现的唯一解决方法是将bean标记为@Scope(ScopeType.SESSION),它在用户登录会话的生命周期内维护bea

我对在我的有状态支持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(){}

}
@Stateful
@作用域(ScopeType.CONVERSATION)
@名称(“会话活动”)
@限制(“#{identity.isLoggedIn()}”)
公共类SessionActionsBean实现SessionActions,可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
@记录器私有日志;
@RequestParameter私有字符串sId;
@在重定向中重定向;
@私人信息海报;
@在私有地图消息中;
@创造
@开始(join=true)
@凌驾
公共void create(){
debug(“正在创建bean”)
}
//---------------------------清理方法
@除去
@旁路拦截器
@凌驾
public void cleanUp(){}
}

每次都会重新创建bean,因为当您返回到该页面时,可能会有新的对话

如果您需要保持对话的开放性,您应该在导航期间查看对话传播机制

但是,如果逻辑需要的话,每次重新创建bean并没有什么错。如果您关心性能,在进行适当的分析之前,不要对对象创建进行预防性假设

如果您的
@Create
@Remove
方法管理范围比conversation更广的资源,您应该将会话范围的bean与管理该资源的另一个会话范围的bean分开


这是一个相当抽象的推理,但我希望它能有所帮助。

谢谢Stefano,这确实为我澄清了一些事情,我不希望每次都重新启动bean的原因是create方法包含一些我不想重复的大型数据库事务。我已尝试删除“@Begin”注释,但每次bean仍会重新启动,我还检查了其他地方没有“@End”的实例……您能给我一个传播对话的示例吗?我通过使用元素导航而不是标准来实现这一点……感谢您为我指明了正确的方向;-)