使用@ConversationScoped 时出现 PrimeFaces 6.1 commandButton 问题

PrimeFaces 6.1 commandButton issue when working with @ConversationScoped

Java1.7/JSF 2/JPA 2/PrimeFaces 6.1

我正在重构我的应用程序以使用 @ConversationScoped。我有一个支持 bean,允许用户在提供一些搜索参数后 select 多个实体。对于结果列表中的每一行,我都有一个导航到另一个视图的编辑按钮。

一切正常,直到用 @ConversationScoped 注释了支持 bean。此后,每次用户单击任何编辑按钮时,搜索页面都会重新加载并且不会发生导航。

不再调用绑定到编辑按钮的编辑方法。

有什么想法吗?

您是否通过 Conversation#begin() 将对话标记为持久性?

默认情况下的 CDI 对话是 'transient',这意味着它的行为与 @RequestScoped bean 相同。

如果您有支持 bean,则只需将 Conversation 注入其中即可:

private @Inject Conversation conversation;

然后在您的操作中调用 conversation.begin(),这应该会打开一个对话。

请注意,您还需要明确地end()您的对话!

在代码中处理此问题的更简单方法可能是利用 Apache DeltaSpike @ViewAccessScoped。这有点像 'auto-conversation'。只要您访问上下文实例,它就会保持活动状态。一旦你离开并且不再触摸它,它就会被摧毁。

这个顺便说一句也处理多个浏览器选项卡。我们甚至有一个单独的作用域:@WindowScoped。这为您提供了每个浏览器选项卡的单独实例!也可能适用于您的用例。

我没有添加 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 参数,当我遇到我描述的问题时它不存在。