我对在我的有状态支持 bean 上使用哪个范围有点困惑,我目前有一个通过 JSF 将用户结果传递到 xhtml 页面的 bean,该 bean 使用默认值(对话范围)和 @Create 方法标记为 @Begin(join=true)...这应该使 bean 加入当前长时间运行的对话,对吗?
但是我发现,当用户导航到不同的页面,然后再次返回时,@Create 方法会在支持 bean 上再次被调用,这是我想避免的
我发现的解决这个问题的唯一方法是将 bean 标记为 @Scope(ScopeType.SESSION),它在用户登录 session 的生命周期内维护 bean(如预期)。
但是在 SEAM 文档中读过几次后,发现以这种方式使用 session 作用域支持 bean 是不好的做法...我的问题是,如何阻止 session 作用域 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(){}
}
最佳答案
每次都会重新创建您的 bean,因为当您返回该页面时,您可能会进行新的对话。
如果您需要保持对话开放,您应该在导航过程中查看对话传播机制。
但是,如果逻辑需要的话,每次重新创建 bean 并没有什么问题。如果您担心性能,请不要在正确的分析之前对对象创建进行预防性假设。
如果您的 @Create
和 @Remove
方法管理的资源范围比 session 范围更广,则应该将您的 session 范围 Bean 与管理该资源的另一个 session 范围 Bean 分开.
这是一个相当抽象的推理,但我希望它能有所帮助。
关于java - SEAM session 还是 session 作用域 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10535967/