极简Java EE 7项目依赖注入失败,@Inject注入字段为null如何解决?
问题根源
Apache Tomcat 9 属于轻量化Servlet容器,并未内置完整Java EE规范要求的CDI(上下文与依赖注入)实现能力,@Inject是CDI规范提供的注解,Tomcat默认无法识别并处理该注解的注入逻辑,因此会出现注入对象为null的情况。
解决方案
你可以从两种路径中选择符合需求的方案处理:
方案1:切换为支持完整Java EE的容器
直接使用原生支持CDI的企业级容器,无需修改现有代码即可正常运行,可选容器包括:
- Apache TomEE(Tomcat的Java EE增强版本,适配成本最低)
- WildFly
- GlassFish
- Payara
方案2:为现有Tomcat 9添加CDI支持
如果必须使用Tomcat 9,可手动集成CDI实现(以官方推荐的Weld实现为例):
- 导入Weld Servlet依赖
如果使用Maven,在pom.xml中添加如下依赖:
<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-core</artifactId> <version>3.1.9.Final</version> </dependency>
如果手动导包,将对应版本的Weld Servlet相关jar包放入项目WEB-INF/lib目录即可。
2. 添加CDI配置文件
在项目WEB-INF目录下新建beans.xml文件,内容如下:
<?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>
- 验证注解包导入正确性
确认@ApplicationScoped注解导入的包为javax.enterprise.context.ApplicationScoped,不要误导入Spring框架等其他框架的同名注解。
完成上述配置后重新部署项目,@Inject注解即可正常完成注入。
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

