【问题标题】:CDI : @Inject not failing when using @PostConstructCDI:使用@PostConstruct 时@Inject 不会失败
【发布时间】:2014-06-13 22:31:18
【问题描述】:

谁能向我解释为什么第一种和第二种情况失败导致NullPointerException 因为b2 和/或b3Bean1 的构造函数中仍然为空,而第三种情况正常工作。

在所有情况下都有这个:

@Stateless
public class Bean2 {

   @Inject
   private Bean3 b3; 

   public Bean2(){

   }

}

第一种情况:(失败)

@Singleton
@StartUp
public class Bean1 {

   @Inject
   private Bean2 b2;

   public Bean1(){
     b2.someMethod(); // b2 throws null pointer exception
   }

}

第二种情况:(失败)

@Singleton
@StartUp
public class Bean1 {

   private Bean2 b2;

   public Bean1(){
     b2 = new Bean2();
     b2.someMethod(); // b3 throws null pointer exception
   }

}

第三种情况:(成功)

@Singleton
@StartUp
public class Bean1 {

   @Inject
   private Bean2 b2;

   public Bean1(){

   }

   @PostConstruct
   public init(){
     b2.someMethod();
   }


}

【问题讨论】:

    标签: java ejb cdi


    【解决方案1】:

    注入只发生在 bean 被实例化之后,这发生在你的构造函数被调用之后,这就是为什么在第一种情况下你有一个 NPE。

    在第二种情况下,您将自己实例化 bean b2,这意味着它不会由 Java EE 服务器管理(这意味着没有注入),因此请参考。 b3 将为空。

    在第三种情况下,当您的 init 方法被调用时,所有的构造函数都已被调用并且 bean 已被注入。

    【讨论】:

    • 同样重要的是要指出@PostConstruct 方法是一个回调,一旦所有注入点都得到满足。您可以通过将@Inject 放在一个接受所有依赖项的构造函数上来模仿这种行为,但您需要自己设置它们。
    • 这是一个很棒的答案!谢谢! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2011-05-07
    • 2017-11-08
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多