【问题标题】:JSF ConversationScoped bean not elevating scope between POSTsJSF ConversationScoped bean 不提升 POST 之间的范围
【发布时间】:2011-10-26 23:22:11
【问题描述】:

我有一个 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 和 var="obj" 来输出带有 commandButton 的行,以查看用户单击的行的对象。每行的按钮如下所示。

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

当用户单击其中一行中的命令按钮时,他们将被带到 page2.xhtml,其中显示有关 obj 的更多详细信息。这可以正常工作并显示详细信息。当我在 view(MyObject selectedObj) 操作方法中时,我立即调用 conversation.begin(),分配 this.obj = selectedObj,然后用户获取 page2.xhtml。

但是,当用户单击 page2 上的 commandButton 时,它应该重新显示与来自 page1 时发生的 view() 操作调用分配的 obj 不同的信息,因为范围已提升到对话。这没有发生。当作用域本应防止其丢失时,bean 中的 obj 字段为空。因此,当他们单击 page2 上的命令按钮时,当页面尝试解析 #{myBean.someProperty} 时,它会给出空指针异常。

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • Lars Bohl 已经回答了这个问题。为什么要重复已经给出的答案?这是一个问答网站,如果您同意,您可以在其中投票给其他人的答案,而不是一个老式的论坛,在那里人们会以原始方式重复其他人的帖子。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2011-10-17
    • 2011-07-28
    相关资源
    最近更新 更多