gpt4 book ai didi

java - JSF ConversationScoped bean 未提升 POST 之间的范围

转载 作者:行者123 更新时间:2023-12-01 17:35:17 26 4
gpt4 key购买 nike

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

@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。

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

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

最佳答案

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

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

关于java - JSF ConversationScoped bean 未提升 POST 之间的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7060181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com