设置
假设您有两个 bean 存档模块 A 和 B,其中 A 依赖于 B(我们无法修改 B)。在 B 中,假设有一个类,其中注入了一个 EntityManager,如下所示:
@Dependent
class SomeClassImpl implements SomeClass {
private EntityManager em;
public SomeClassImpl() {}
@Inject
public SomeClassImpl(EntityManager em) {
this.em = em;
}
...
}
注意 SomeClass 接口永远不会直接注入 A.
因为实体管理器不是 cdi bean,我们可以在 A 中定义它的生产者。这在 WAR 存档中部署时按预期工作。
问题
现在,考虑以下情况:您有三个 bean 存档模块 X、Y 和 Z,其中 X 和 Y 都依赖于上面定义的 Z。因为 X 和 Y 为 EntityManager 定义了一个生产者,并且这些生产者对所有模块都是可见的,所以我们必须为 X 和 Y 的生产者添加限定符,以避免不满足的依赖项异常。
现在,问题是我们如何处理Z中的歧义?
如果生产者只对定义的模块可见,那么这将减少第一个场景。但是因为他们不是,我们会得到
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers
注意:虽然这可以通过自定义范围解决,但我宁愿尽可能避免构建一个范围。
如果是你,你会如何解决这个问题?