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

Java EE环境下CDI不生效、@Inject注入对象为null是什么原因?

问题排查方向

  • 确认MyClassImpl的实例是否由容器创建
    CDI仅对容器管理的Bean生效,如果你是通过new MyClassImpl()手动创建实例,所有@Inject注入点都会是null。所有需要注入的Bean都必须从CDI上下文获取,或者自身也是被容器管理的Bean。
  • 检查注解包导入是否正确
    核对所有注解的包路径,避免导入其他框架同名注解:
    • @Inject必须是javax.inject.Inject
    • @ApplicationScoped必须是javax.enterprise.context.ApplicationScoped
    • @Stateless必须是javax.ejb.Stateless
  • 确认beans.xml路径和配置正确
    WAR包结构下,beans.xml必须放在WEB-INF/beans.xml路径下,如果你放在META-INF目录下会不生效。正确的bean-discovery-mode="all"配置示例:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
           bean-discovery-mode="all">
    </beans>
    
  • 排查依赖冲突
    执行mvn dependency:tree检查项目是否打包了额外的CDI实现(如Weld相关依赖),和Payara Micro自带的Java EE实现冲突,多余的CDI相关依赖需设置<scope>provided</scope>或者排除。
  • 检查Bean类是否被final修饰
    CDI需要为普通作用域Bean生成动态代理,final类无法被继承生成代理,会导致注入失败,去掉GreetingService、MyClassImpl上的final修饰符即可。
  • 核对Payara Micro启动参数
    确认启动命令中没有添加--disable-cdi之类的禁用CDI功能的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:27:01