San*_*and 3 java cdi java-ee-6
我正在尝试使用和理解CDI,当我在简单的pojo类中使用@Inject时,它会抛出NPE。
示例Greeting.java
public Class Greeting {
 public String greet() {
   System.out.println("Hello");
 }
}
Test.java
 import javax.inject.Inject;
 public class Test {
   @Inject 
   private Greeting greeting;
   public void testGreet() {
    greeting.testGreet();
   }
}
当我调用testGreet()时,它抛出NPE,为什么问候实例为null。@Inject添加依赖项的方式仅在容器管理的Bean中使用吗?注意:这里不是jar的问题。
小智 6
TL; DR:@Inject注释的字段仅用于容器实例化的Bean。
加长版:CDI容器为您提供了许多实用程序,可以轻松地将依赖项注入到bean中,但是魔术无法正常工作。如果客户端Bean本身是由容器实例化的,则容器只能填充客户端Bean的带注释字段。当容器实例化对象时,事件序列如下:
您面临一个经典的引导问题,即如何从非容器管理的代码转换为容器管理的代码。您的选择是:
BeanProvider.getContextualReference(Test.class, false);)new Test();。例如,可以通过设置启动单例ejb来完成此操作,该单例在@PostConstruct注释的初始化中调用您的测试。希望这可以帮助。