【问题标题】:Injecting RequestScoped CDI Bean into ApplicationScoped CDI Bean via Producer class通过 Producer 类将 RequestScoped CDI Bean 注入 ApplicationScoped CDI Bean
【发布时间】:2016-06-08 01:13:24
【问题描述】:

本文解释了您可以将 RequestScoped bean 注入 ApplicationScoped bean 中,客户端代理将在请求期间指向正确的实例: Bean instance of a shorter scope injected in a bean instance of a larger scope in CDI - how does it work?

当使用单独的生产者类进行一些额外处理并生成 RequestScoped bean 时,这是如何工作的? 在部署到应用程序服务器后,由于不明确的依赖关系,我得到了一个 DeploymentException,因为托管 bean 和我的生产者方法都符合条件。

【问题讨论】:

  • 我正在摆脱我的生产者类并直接在我的 RequestScoped Bean 中进行额外的处理。这似乎是一种更好的方法,因此所有内容都集中在一个地方,而不是分布在两个类中。

标签: java dependency-injection cdi java-ee-7


【解决方案1】:

确实,它有效。在这种情况下,CDI impl 只会在需要时执行您的 @Produces 方法。

您遇到了异常,因为 CDI 按类型搜索 bean,并且您有两个相同类型的定义。因此,如果您已经使用 @Produces 声明了 bean,则不能让 CDI 在类路径上拥有完全相同的 bean 定义。

以下示例无效:

@ApplicationScoped
public class SomeFactory {

    @Produces
    public SomeBean produceSome() {
        return new SomeBean();
    }
}

@RequestScoped   // bug, redundant definition
public class SomeBean {
}

附言。细节还取决于bean-discovery-mode的实际值。

您也可以查看此示例SO answer

就我个人而言,我不喜欢自动发现和类路径扫描——但这个概念是 CDI 和 Java EE 的基础。这也是我通常不推荐人们使用 Java EE 服务器的原因之一。

【讨论】:

  • 好的,所以唯一的解决方案是使用自定义限定符。我们过去在注入 String 时使用了这种方法。所以我宁愿彻底摆脱制片人。感谢您的澄清!
  • 不客气。附言。需要明确的是,自定义限定符不是唯一的解决方案。替代方法是从所有 bean 中删除 bean-discovery-mode="annotated" +,您有 Producers 方法,任何“bean 定义注释”。
猜你喜欢
  • 2014-06-02
  • 2019-08-04
  • 2013-12-07
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多