java - CDI : @Inject not failing when using @PostConstruct

标签 java ejb cdi

任何人都可以向我解释为什么第一个和第二个案例失败导致 NullPointerException 因为 b2 和/或 b3 仍然为空在Bean1的构造函数中,当第三种情况工作正常时。

在所有情况下都有这个:

@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();
   }


}

最佳答案

注入(inject)仅在 bean 实例化之后发生,这在调用构造函数之后发生,这就是为什么在第一种情况下会出现 NPE。

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

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

关于java - CDI : @Inject not failing when using @PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214617/

相关文章:

performance - 如何提高向数据库插入数据的性能?

java - DefaultWindowContextQuotaHandler 和 JsfWindowContextQuotaHandler 之间的 DeltaSpike 模糊依赖

java - @Initialized(ApplicationScoped.class) 事件何时在 CDI 中发送?

jpa - Quarkus 依赖注入(inject) JPA 实体管理器的问题

java - 同步块(synchronized block)显示奇怪的结果

java - 字符串什么时候缓存它的哈希码?是在 String 对象创建期间还是在调用 hashcode 方法后?

java - 通过反射将检索到的对象转换为字符串(如何迭代多个类类型?)

java - 为什么这里不允许转换为 "GenericType<?>"?

java - 这是有效的 EJB-QL 吗?

jsf - EJB 是否应该是实例变量并在 JSF Managed Beans 中标记为 transient ?