通过生产者将 RequestScoped CDI Bean 注入 ApplicationScoped CDI Bean class

Injecting RequestScoped CDI Bean into ApplicationScoped CDI Bean via Producer class

本文解释了您可以将 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?

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

确实有效。在这种情况下,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 {
}

Ps。详情还取决于 bean-discovery-mode.

的实际值

您也可以查看此示例 SO answer

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