本文解释了您可以将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和我的producer方法都符合条件。
答案 0 :(得分: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服务器的原因之一。