是否可以在定义它们的模块中隔离 CDI 生产者(在具有共享模块的模块应用程序中)

问题描述 投票:0回答:0

设置

假设您有两个 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

注意:虽然这可以通过自定义范围解决,但我宁愿尽可能避免构建一个范围。

如果是你,你会如何解决这个问题?

java jakarta-ee cdi open-liberty
© www.soinside.com 2019 - 2024. All rights reserved.