SEAM会话或会话范围的bean?

时间:2012-05-10 14:17:46

标签: java seam seam2 seam-conversation

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

}

1 个答案:

答案 0 :(得分:2)

每次都会重新创建bean,因为当你回到那个页面时,你可能会有一个新的对话。

如果您需要保持对话开放,则应在导航过程中查看对话传播机制。

然而,每次重新创建bean都没有错,如果这是逻辑需要的话。如果您担心表演,在进行适当的剖析之前,不要对对象创建做出预防性假设。

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

这是一个非常抽象的推理,但我希望它可以提供帮助。