Events 从另一个会话范围的托管bean访问会话范围的托管bean

Events 从另一个会话范围的托管bean访问会话范围的托管bean,events,jsf-2,Events,Jsf 2,我在打开另一个sessionScoped托管bean时遇到问题。 我有一个页面,其中有一个包含对象列表的表。 在行单击时,我导航到另一个页面并显示其内容。 我正在sessionMap对象中或通过Flash发送单击的行。 在另一页中发送和读取对象,并显示数据。 在另一个页面中,我收到了@PostConstruct方法中的sessionMap或Flash public void init() { obj = (Obj) FacesContext.getCurrentInstance().ge

我在打开另一个
sessionScoped
托管bean时遇到问题。 我有一个页面,其中有一个包含对象列表的表。 在行单击时,我导航到另一个页面并显示其内容。 我正在
sessionMap
对象中或通过
Flash
发送单击的行。 在另一页中发送和读取对象,并显示数据。 在另一个页面中,我收到了
@PostConstruct
方法中的
sessionMap
Flash

public void init() {
    obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
如果我返回并打开另一个对象,第一个对象将打开,问题是它是一个
sessionScoped
bean,因此在第二个打开时,它将不会调用
@PostConstruct
。 那么,强制
sessionScoped
读取新值并打开另一个会话的解决方案是什么? 或者如何通过侦听器而不是
@PostConstruct
读取对象

page1.java

@ManagedBean
@SessionScoped
class pageBean{

    MyObject myObj;
    public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
    }
}


您的托管bean应该已
@viewscope
。否则,您需要在(操作)侦听器方法中获取它,例如

或者,如果您的唯一目的是在EL中访问它,则可能会在getter中延迟加载:

public Obj getObj() {
    if (obj == null) {
        obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
    }

    return obj;
}
但是这没有任何意义,因为会话范围的对象只是通过
{obj}
直接在EL中可用,而不需要像
{bean.obj}
这样的中间bean

至少,整个设计毫无意义。这就是为什么我建议它们实际上应该是
@viewscope

另见:

我知道我必须使用viewScope,但我的问题是它与ui:composition和ui:insert和ui:include冲突,我无法删除它们,因此我必须使用sessionScope。我的问题是,如何在打开的页面上(导航到页面时)在另一个managedBean中进行调用通过这种方式,我可以告诉managedBean获取另一个对象,而不是它拥有的对象哦,是的,这就是我所想的,但我太慢了:)好吧,那么我现在可以做什么呢?我想使用一个listner,其中打开的页面获取事件,但我不知道如何使用:SAs说,在(操作)侦听器方法中执行作业(例如,
或在getter中,如果需要的话,通过延迟加载。但是在getter中这样做没有任何意义,因为会话属性在EL中已经直接可用,它们的名称类似于
{obj}
。我将尝试在getter中读取对象,但是我可以知道如何使用以及它的用途吗
public void init() {
    obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
public Obj getObj() {
    if (obj == null) {
        obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
    }

    return obj;
}