JSF ConversationScoped bean没有提升POST之间的范围

时间:2011-08-14 22:34:03

标签: java jsf java-ee jsf-2 seam-conversation

我有一个bean,它有一个名为view()的动作方法和一个MyObject类型的字段:

@ManagedBean
@ConversationScoped
public class MyBean implements Serializable{
    private @Inject Conversation conversation; //has getter and setter
    private MyObject object; //has getter and setter
    ... other fields follow

    public String view(MyObject selectedObj){
        conversation.begin();
        return "success";
    }

    public String getSomeProperty(){
            return object.getProperty();
    }

    ...other methods follow
}

在screen1.xhtml上我使用primefaces p:dataTable with var =“obj”输出带有commandButton的行来查看用户点击的行的对象。每行上的按钮如下所示。

<p:commandButton action="#{myBean.view(obj)}"
ajax="false" title="View Clone" image="ui-icon ui-icon-locked"/>

当用户点击其中一行中的commandButton时,它们将被带到page2.xhtml,其中显示有关obj的更多详细信息。这可以正常工作并显示详细信息。当我在视图(MyObject selectedObj)动作方法内部时,我立即调用conversation.begin(),分配this.obj = selectedObj,用户获取page2.xhtml。

但是,当用户在第2页上单击commandButton时,它应该重新显示来自obj的不同信息,该信息来自于来自page1时发生的view()动作调用,因为范围被提升为会话。这不会发生。当范围应该防止它丢失时,obj字段在bean中为null。因此,当他们在第2页上单击commandButton时,当页面尝试解析#{myBean.someProperty}时,它会给出空指针异常。

我错过了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

@ConversationScoped是CDI的一个功能,而不是JSF本身。这意味着为了使其正常工作,您必须将@ConversationScoped与@ javax.inject.Named结合使用,而不是@ManagedBean。

CDI默认情况下不包含在JSF 2.0或2.1中,因此您还需要添加一个CDI实现,如Weld(请参阅http://seamframework.org/Weld)和“empty beans.xml”,如焊接文档中所述

答案 1 :(得分:2)

@ConversationScoped CDI 的注释。如果你使用它,你绝不能使用@ManagedBean这是一个JSF注释。相反,你必须用@Named注释bean。