我在从另一个人打开一个sessionScoped托管bean时遇到了问题。我有一个包含对象列表的表。在行单击上,我将导航到另一个页面并显示其内容。我正在sessionMap对象或Flash中发送已单击的行。在另一个页面中发送和读取该对象,并显示数据。在另一个页面中,我正在接收sessionMap或Flash中的@PostConstruct方法。
如果我返回并打开另一个对象,第一个对象将打开,问题是它是一个sessionScoped bean,所以在第二个打开时,它将不会调用@PostConstruct。那么,强制sessionScoped读取新值并打开另一个会话的解决方案是什么?或者如何通过侦听器而不是@PostConstruct读取对象?
page1.java
@ManagedBean
@SessionScoped
class pageBean{
MyObject myObj;
public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
}
}@ManagedBean
@SessionScoped
class pageBean{
@PostConstruct
public void init()
MyObject = (MyObject)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}发布于 2013-01-11 13:35:36
托管bean应该是@ViewScoped。否则,您需要在(操作)侦听器方法(如<f:event> )中获得它。
<f:event type="preRenderView" listener="#{bean.init}" />其中,您在init()方法中获得会话对象。
public void init() {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}如果您的唯一目的是在EL中访问它,也可能懒洋洋地加载在getter中:
public Obj getObj() {
if (obj == null) {
obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
return obj;
}但是,这是没有意义的,因为会话作用域对象通过#{obj}直接在EL中可用,而不需要中介bean (如#{bean.obj} )。
至少,整个设计没有意义。这就是为什么我建议他们实际上应该是@ViewScoped。
另请参阅:
https://stackoverflow.com/questions/14278598
复制相似问题