You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:01