【问题标题】: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 参数,当我遇到我描述的问题时,它不存在。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 2011-06-21
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多