2012-05-10 60 views
1

我有点困惑我的有状态支持bean上使用哪个范围,我目前有一个bean,通过JSF将用户结果传递到xhtml页面,bean使用默认(对话范围),标记@Create方法as @Begin(join = true)....这应该使bean加入当前长时间运行的对话,对吧?SEAM会话或对话范围的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(){} 

} 

回答

2

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

如果您需要保持对话状态,请在导航过程中查看对话传播机制。

然而,每次重新创建bean都没有错,如果这是逻辑要求的话。如果您担心表演,请不要在正确分析之前就对象创作进行预防性假设。

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

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

+0

谢谢Stefano,这确实为我澄清了一些事情,我不希望每次都重新启动bean的原因是create方法包含一些我不想继续重复的大型数据库事务。我曾尝试删除'@Begin'注释,但每次仍然重新启动bean,我也检查过其他地方没有'@End'的实例...您能举个例子来传播对话吗? – DaveB

+0

我通过使用元素来实现此目的,而不是标准的 .... Thankyou将我指向正确的方向;-) – DaveB