【问题标题】:How to keep state during ajax call using CDI如何使用 CDI 在 ajax 调用期间保持状态
【发布时间】:2012-05-31 01:28:23
【问题描述】:

我正在使用 CDI (Weld),但遇到了问题,希望您能提供帮助。 我有一系列 Primefaces selectOneMenu,其中一个中选择的值用于填充下一个。问题是,我需要在我的 ManagedBean 上使用 SessionScoped 来获取已选择项目的值。我知道 JSF 有 ViewScoped,在这种情况下会有很大帮助,但由于我使用的是 CDI,所以这不是一个选项。接缝也不是一种选择。有一种解决方法可以使用,例如 RequestScoped,或者我真的需要在我的 bean 上使用 SessionScoped?

谢谢!

【问题讨论】:

    标签: java cdi jboss-weld


    【解决方案1】:

    没有什么可以阻止您同时使用 JSF 托管 bean 和 CDI bean。例如,您可以将@javax.faces.bean.ViewScoped @javax.faces.bean.ManagedBean@javax.inject.Inject CDI bean 放入其中。因此,如果视图范围适合解决问题,请继续使用它。我已经使用普通的 GlassFish 3.1.2 服务器 (JSF 2.1) 对此进行了测试。

    另一种选择是使用 CDI 的 @javax.enterprise.context.ConversationScoped (http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/scopescontexts.html#d0e1841)。这在涉及一系列请求/视图的场景中效果最佳,这些请求/视图具有明确定义的起点和终点,您可以在其中开始和结束对话。

    【讨论】:

    • 不,这行不通,您最终会得到两个对象实例,一个是创建的 JSF,另一个是创建的 CDI。在 JSF 2.2 中,这不是问题。 JSF 2.0 在 JSR 299 (CDI) 完成之前完成并且没有适当的集成。 JSF 2 (2.1) 的 MR 也没有添加任何 CDI 集成。
    • 正如 LightGuard 所说,这确实是一个问题。如果我使用 ViewScoped 和 ManagedBean,我将无法处理注入其中的其他对象,因为它们不受 CDI 控制。 LightGuard,我对 JSF 2.2 的集成感到好奇(在以后的机会中),是否可以像 Brian 所说的那样做?
    • @LightGuard,我没有遇到任何问题。需要明确的是,我没有在 bean 上混合 JSF 和 CDI 注释。该 bean 被注释为 @ViewScoped @ManagedBean 并具有 @Inject 注释字段。我只是在构造函数中设置了一个断点,它只被调用一次(由 JSF)并且确实接收 CDI bean 的注入。我会不小心使用未指定的行为吗?我正在运行库存的 GlassFish 3.1.2(带有 Mojarra 2.1.6 和 Weld 1.1.4)。我想明白这一点。您知道我可以阅读的针对 2.2 的 JSF 规范问题吗?
    • 您使用的是哪个 ManagedBean 注释?这是唯一可能使这项工作发挥作用的事情,除非 Glassfish 已经完成了某些工作,或者 JSF 2.1 中的某些内容。
    • @LightGuard 好问题。我正在使用 javax.faces.bean.ManagedBean。我已经相应地更新了我的答案。也许这是 JSF 2.1 中的内容,但我无法为 2.1 找到一个好的更改列表(我确实发现没有列出任何与此明显相关的内容)。如果您遇到任何事情,我仍然有兴趣看到它。
    【解决方案2】:

    查看 MyFaces CODI 的 ViewScope 或创建您自己的 ViewScope 的 CDI impl :)

    【讨论】:

    • 是的,看到一些关于 MyFaces CODI 的内容,但由于我已经混合了太多东西(JSF、primefaces、richfaces、weld 等等),我不想添加新的.但就目前而言,它看起来是我最好的选择。我想要一些不使用 SessionScoped 或其他框架的解决方法,有什么想法吗?
    【解决方案3】:

    仅使用 CDI 扩展来创建您自己的范围,因为您的 bean 在 facescontext viewroot 映射中的 ajax 回调期间保持活动状态 所以看看这个链接:http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2018-09-10
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多