【发布时间】:2017-11-29 02:41:05
【问题描述】:
我遇到了一个奇怪的问题,当将一个单例 bean(B 类)注入另一个单例 bean(A 类)时,我得到了一个 NullPointerException,其中两个 bean 都使用 EJB 3.1 注释。 NPE 发生是因为从类 A 访问时映射为空,即使注入了类 B。 例如:
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
@Singleton
@Startup
public class A {
@Inject
B b;
@PostConstruct
public void initialise() {
b.map.put("test", 1);
System.out.println("A initialised");
}
}
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import java.util.HashMap;
@Singleton
public class B {
HashMap<String, Integer> map;
@PostConstruct
public void initialise() {
map = new HashMap<>();
System.out.println("B initialised");
}
}
但是,如果我对 B 类使用 CDI 单例注释,则代码将按预期执行:
import javax.annotation.PostConstruct;
import javax.inject.Singleton;
import java.util.HashMap;
@Singleton
public class B {
HashMap<String, Integer> map;
@PostConstruct
public void initialise() {
map = new HashMap<>();
System.out.println("B initialised");
}
}
EJB 注解在这种情况下不起作用是有原因的吗?
【问题讨论】:
-
尝试对
B类使用渴望初始化 - 例如使用@Startup。这样我怀疑 B 可能还没有被初始化(你只得到某种代理对象)并且你尝试访问它的方式太快了。 -
刚刚再次尝试@Startup 以确定但仍然抛出 NPE。甚至在 A 中尝试过 @DependsOn("B") ,但也没有用。
标签: jakarta-ee dependency-injection ejb cdi