@Inject注入对象为null:WildFly中CDI构造器调用依赖异常排查
解决CDI注入空指针的问题
首先,你的问题核心有两个,咱们逐个拆解:
1. 构造器里访问注入依赖必然触发空指针
CDI(包括EJB注入)的执行逻辑是:先调用类的构造器创建对象,完成对象构造后才会执行依赖注入。你在MyBean的构造器里直接调用myData.method()时,myData还没被容器注入,自然是null。
修复方案:用@PostConstruct做初始化
把需要依赖注入对象的初始化逻辑,移到被@PostConstruct注解的方法里——这个方法会在所有依赖注入完成后自动执行:
@Named @RequestScoped public class MyBean implements Serializable { @Inject private MyData myData; private List<?> dataList; // 根据你的实际数据类型调整 public MyBean() { // 构造器只做无依赖的基础初始化,不要碰注入的对象 } @PostConstruct public void initDataList() { // 这里myData已经被正确注入,可以安全调用方法 this.dataList = myData.method(); } // ... 其他业务方法 }
2. MyData的EJB可见性不符合规范
你的MyData用了@Singleton(EJB单例注解),但它是包私有类(没有public修饰符),而EJB规范明确要求EJB类必须是public的,否则WildFly容器无法识别它为合法的EJB,直接导致注入失败。同时,method()方法也是包私有,外部类MyBean无法直接调用,这也会引发问题。
修复方案:修正MyData的可见性
@Singleton public class MyData { // 添加public修饰符,让容器能识别为EJB @Inject private MyHandler myHandler; // 建议类名首字母大写,符合Java编码规范 public List<?> method() { // 添加public修饰符,允许外部类调用 // 你的业务逻辑代码 } }
额外补充说明
- 关于
@Startup和@DependsOn:这两个注解是控制EJB的启动顺序,和你当前的空指针问题无关——你的问题根本不是EJB没启动,而是注入时机错误+类可见性不合法。 - 类名规范:你的
myHandler类名首字母小写,建议改成MyHandler,避免容器识别时出现潜在的命名问题。
按照上面的步骤修改后,myData应该能被正确注入,空指针问题就能解决了。
内容的提问来源于stack exchange,提问作者flyby
相关产品推荐
相关产品推荐

