【问题标题】:PrimeFaces 6.1 commandButton issue when working with @ConversationScoped使用 @ConversationScoped 时出现 PrimeFaces 6.1 commandButton 问题
【发布时间】:2018-04-26 16:01:35
【问题描述】:
Java 1.7 / JSF 2 / JPA 2 / PrimeFaces 6.1
我正在重构我的应用程序以使用@ConversationScoped。我有一个支持 bean,它允许用户在提供一些搜索参数后选择多个实体。对于结果列表中的每一行,我都有一个编辑按钮,可以导航到另一个视图。
在使用 @ConversationScoped 注释支持 bean 之前,一切正常。之后,每次用户单击任何编辑按钮时,搜索页面都会重新加载,并且不会发生导航。
不再调用绑定到编辑按钮的编辑方法。
有什么想法吗?
【问题讨论】:
标签:
primefaces
cdi
jsf-2.2
【解决方案1】:
您是否通过 Conversation#begin() 将对话标记为持久?
默认情况下,CDI 对话是“瞬态”的,这意味着它的行为与 @RequestScoped bean 相同。
如果您有支持 bean,那么只需将对话注入其中:
private @Inject Conversation conversation;
然后在您的操作中调用conversation.begin(),这应该会打开一个对话。
请注意,您还需要明确地end()您的对话!
在您的代码中处理此问题的一种更简单的方法可能是利用Apache DeltaSpike@ViewAccessScoped。这是一种“自动对话”。只要您访问上下文实例,它就会保持活动状态。一旦你离开并且不再触摸它,它就会被摧毁。
这个顺便说一句也处理多个浏览器选项卡。我们甚至有一个单独的范围:@WindowScoped。这为每个浏览器选项卡提供了单独的实例!也可能适用于您的用例。
【解决方案2】:
我没有添加 cdi 按钮参数。为了解决这个问题,我的按钮必须是这样的:
<p:commandButton title="Edit"
action="#{myMB.nextView}"
ajax="false">
<f:param name="id" value="#{bean.id}"/>
<f:param name="cid" value="#{myMB.conversation.id}"/>
</p:commandButton>
注意 cid 参数,当我遇到我描述的问题时,它不存在。