【问题标题】:Viewscoped JSF and CDI beanViewscoped JSF 和 CDI bean
【发布时间】:2013-09-24 17:32:01
【问题描述】:

我在 JBoss EAP 6 上使用 Java EE 6,我的 JSF bean 注释如下: @ManagedBean @ViewScoped(均来自javax.faces.bean包)

但是,它们也是 CDI bean(默认构造函数,使用 @Inject@PreDestroy 等)。我一直在阅读,您不能混合使用这些注释(JSF 和 CDI),但它显然工作正常:注入工作正常,在视图更改时调用 preDestroy 等)。

我错过了什么吗?问题是什么?为什么不使用?

【问题讨论】:

    标签: jsf cdi view-scope


    【解决方案1】:

    CDI @Inject“无处不在”工作,因此也在 JSF @ManagedBean 内部。 JSF 对应的 @ManagedProperty 仅在 @ManagedBean 内工作。您也不能@Inject 在任何 CDI 托管 bean 中使用真正的 JSF 托管 bean(相反,它将是一个 CDI 托管实例)。也许这就是您正在阅读的内容。然而,普遍的共识确实是最好不要混合它们以避免在初学者之间产生混淆。 JSF utility library OmniFaces 具有适用于 JSF 2.0/2.1 的 CDI 兼容 @ViewScoped

    @PreDestroy 顺便说一下不是特定于 CDI,其对应的 @PostConstruct 也不是。它们应该在 CDI 托管 bean 和 JSF 托管 bean 中都能正常工作。

    【讨论】:

    • 感谢您的回答。似乎我真的对所有这些事情感到困惑......所以我拥有的是 JSF 托管 bean,而不是 CDI bean?即使这个 bean 满足所有要求,CDI bean 文档也会讨论(默认构造函数,而不是内部类等)?如果是这样,与 CDI bean 有什么区别?我可以用 CDI bean 做的这个 bean 有什么缺点或我不能做什么?
    • 您不能在其他地方@Inject JSF 托管 bean 实例。如果您实际上并不需要它,那么就没有真正的缺点。但需要注意的是,JSF 正在慢慢转向 CDI。即将推出的新 JSF 特定注解(如 @FlowScoped)仅限 CDI。 JSF @ManagedBean 设施将在不久的将来被弃用。鼓励用户在 CDI 发生之前转移到它。