我正在尝试了解 CDI。我有一个界面:
public interface Person {
public String getName();
}
还有一个实现 Person
的类:
public class Male implements Person {
public Male() {}
@Override
public String getName() {
return "ra";
}
}
在主课中,我尝试了:
public class Main {
@Inject
private Person person;
public static void main(String... args) {
System.out.println(new Main().person.getName());
}
}
但是上面的代码在person.getName()
上抛出NPE
。我使用 maven 创建了项目,javaee
api 的范围是compile
。我做错了什么?
最佳答案
您似乎错过了启动 CDI 容器。
请注意,类上的任何注释就像便利贴一样。它实际上只是附加信息而不是真正的代码。该信息必须被解释。这就是 CDI 容器的作用。 我写了一篇 CDI 介绍文章,解释了一些基础知识: https://jaxenter.com/tutorial-introduction-to-cdi-contexts-and-dependency-injection-for-java-ee-jsr-299-104536.html
你想念什么:
1.) 添加一个空的 META-INF/beans.xml 文件。或者将像 @ApplicationScoped
这样的作用域注释添加到 Male.java
类中。
2.) 添加 CDI 容器。有多种选择。如果您想使用 Apache OpenWebBeans CDI 容器,那么您可以在此处找到一些信息 https://openwebbeans.apache.org/owbsetup_se.html 您还可以在这里找到工作示例
关于java - 类型上的 CDI 会抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443350/