使用@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 参数,当我遇到我描述的问题时它不存在。
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 参数,当我遇到我描述的问题时它不存在。