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
相关产品推荐
相关产品推荐

