使用@ConversationScoped

时间:2018-04-26 16:01:36

标签: primefaces cdi jsf-2.2

Java 1.7 / JSF 2 / JPA 2 / PrimeFaces 6.1

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

在使用@ConversationScoped注释支持bean之前,一切正常。之后,每次用户点击任何编辑按钮时,搜索页面都会重新加载,不会发生导航。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

如果你有你的支持bean,那么只需将Conversation注入其中:

private @Inject Conversation conversation;

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

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

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

这个btw还处理多个浏览器标签。我们甚至有一个单独的范围:@WindowScoped。这为每个浏览器选项卡提供单独的实例!可能也适合你的用例。

答案 1 :(得分:0)

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