【问题标题】:CDI can not inject pojo java class. (Unsatisfied dependencies for type Pojo with qualifiers @Default)CDI 无法注入 pojo java 类。 (带有限定符 @Default 的 Pojo 类型的依赖关系不满足)
【发布时间】:2015-11-13 16:50:21
【问题描述】:

您好,我在将常规 java 类(Pojo 类)注入 EJB bean 时遇到问题。

@ApplicationScoped
public class DomainRouteFinderService {

    @Inject
    private Pojo pojo;

    private AtomicInteger sequencer;

    @PostConstruct
    private void init(){
        sequencer = new AtomicInteger();
        sequencer.lazySet(0);
    }

    @Produces
    @Named("sequencer")
    public String getText(){
        return "Number: "+ sequencer.getAndIncrement();
    }
}

Pojo 类:

public class Pojo {
}

在我的多项目中,结构如下:

ROOT - 耳朵

  1. ejb
  2. 网络

Web 模块依赖于 ejb。

在 web 模块中是 beans.xml 与 bean-discovery-mode="all"

【问题讨论】:

    标签: java jakarta-ee gradle cdi


    【解决方案1】:

    我通过向 ejb 添加另一个 beans.xml 解决了我的问题。 我把这个文件放到 main/java/resources/META-INF 本地化。

    为什么?

    CD 1.1/Java EE 7 中最重要的变化之一是 流行的请求,现在默认启用 CDI。这意味着 不再需要显式添加 beans.xml 来启用 D​​I。 但是,了解 CDI 现在也非常重要 通过 “豆发现模式”属性。这个属性有三种可能 价值观:

    'annotated' - loosely translated, means that only components with a class-level annotation are processed.
    'all' - all components are processed, just like they were in Java EE 6 with the explicit beans.xml.
    'none' - CDI is effectively disabled.
    

    默认情况下,如果不指定任何内容且没有 beans.xml,则 bean 假定发现模式为“annotated”而不是“all”。

    但我想为 ejb 模块和 war 模块创建一个 beans.xml。

    【讨论】:

    • CDI 是为每个模块单独配置的,就是这样。如果您不将另一个 beans.xml 添加到 ejb 模块中,插入 Pojo 的唯一方法是通过 @Dependent 注释对其进行注释 - 这是默认范围 CDI bean,但您需要明确以便 CDI 考虑您的 POJO作为没有额外 beans.xml 的 bean。如果你不能修改你的 Pojo,你可以为它创建一个 CDI 生产者。
    • 所以我的解决方案没问题?
    • 您真的需要部署为 EAR 吗?您现在可以在 WAR 文件中部署 EJB。
    • 解决方法OK,多个beans.xml没有什么问题。在 JavaEE6 中,这是唯一的选择。
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多