任何人都可以向我解释为什么第一个和第二个案例失败导致 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/