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

Weld SE 4.0.2-Final版本JUnit测试中CDI Bean内部依赖注入失败

问题解决办法

核心原因

你使用的weld-se-shaded 4.0.2-Final属于Weld 4.x分支,对应CDI 3.0规范,已经全面迁移到Jakarta EE命名空间,所有原javax.*开头的CDI、Inject注解都已经改为jakarta.*开头。你代码中导入的旧javax包注解无法被Weld 4.x识别,容器不会将标注类识别为CDI Bean,也不会处理@Inject注入点,因此出现字段注入为null的问题。

改用构造函数注入后报错的额外原因:给ZService新增带参构造后没有显式定义无参构造函数,CDI对@ApplicationScoped这类正常作用域的Bean需要生成代理类,必须要求Bean存在可访问的无参构造函数,叠加注解不识别的问题,就会抛出依赖未满足的异常。

两种解决方案

方案1:降级Weld版本适配现有javax代码

如果不想修改现有代码的导入包,直接将Weld版本降到3.x分支(该分支仍兼容javax命名空间)即可:

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-shaded</artifactId>
    <version>3.1.9.Final</version>
    <scope>test</scope>
</dependency>

降级后原字段注入代码可直接正常运行,无需修改业务逻辑。

方案2:修改代码适配Weld 4.x的Jakarta规范

如果要保留当前4.0.2-Final版本的Weld,将所有类中javax相关的导入全部替换为jakarta开头即可:

  • 替换import javax.enterprise.context.ApplicationScoped;为import jakarta.enterprise.context.ApplicationScoped;
  • 替换import javax.inject.Inject;为import jakarta.inject.Inject;

如果使用构造函数注入,需要额外补充无参构造函数(权限设为protected即可,仅给CDI生成代理使用):

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

@ApplicationScoped
public class ZService {

    public YService yService;

    // CDI代理所需无参构造
    protected ZService() {
    }

    @Inject
    public ZService(YService yService) {
        this.yService = yService;
    }

    @Override
    public String toString() {
        return "hi from ZService";
    }
}

你原有disableDiscovery()后手动添加Bean类的配置没有问题,无需调整。

内容的提问来源于stack exchange,提问作者pesche666

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:06