Java EE 7项目Tomcat部署@Inject注入ActionFactory为null报空指针
空指针异常(注入的
actionFactory为null)排查指引 核心场景定位
你当前使用Maven Tomcat插件部署WAR包的架构,本身存在容器能力缺失的天然缺陷,这是注入失败最高概率的原因。
分步排查方向
1. 优先校验Tomcat插件的容器能力
- 常用的
tomcat-maven-plugin本质是轻量Servlet容器,不内置CDI Bean管理、EJB运行时能力,哪怕你配置了beans.xml、给类加了@Stateless/@Named注解,没有对应容器支撑的话,所有注解都不会生效,@Inject标注的字段永远为null。 - 你之前将
beans.xml从META-INF移到WEB-INF的位置调整是正确的,但位置正确不代表容器能识别配置,Tomcat环境下必须额外集成Weld作为CDI实现,才能完成Bean扫描和注入逻辑。
2. 校验Servlet类的注入合法性
- 原生Tomcat实例化的HttpServlet类,默认不是CDI容器管理的对象,不会自动对类内部的
@Inject字段执行注入逻辑。就算你集成了Weld,也必须配置对应的Weld Servlet扩展,才能让Servlet成为合法的注入目标。 - 校验方式:在
ProjectServlet的init()生命周期方法中添加断点,观察actionFactory字段的初始化状态,如果Servlet刚被容器实例化时该字段就是null,说明容器从根流程上就没有对这个类执行注入操作。
3. 校验Bean的容器扫描资格
- 虽然你配置了
bean-discovery-mode="all",但仍需要确认ActionFactory类本身是否满足Bean的识别要求:比如是否存在无参构造、有没有因为类加载路径错误导致容器扫描时跳过该类。 - 检查WAR包的实际内容:确认编译后的
ActionFactory、SigninCommand、UserEJB等类是否完整输出到WEB-INF/classes路径下,有没有因为Maven依赖scope配置错误,导致Weld相关的核心类没有打进WAR包,部署时容器直接跳过了CDI初始化流程。
快速排障验证步骤
- 启动项目时检查日志中是否有Weld的初始化标识(如
WELD-000101系列的启动日志),如果没有相关输出,直接说明CDI容器根本没有启动,当前的注入逻辑完全没有运行环境支撑。 - 临时修改
ProjectServlet中actionFactory的初始化方式为手动new实例,先跑通完整的登录业务流程,排除业务代码本身的逻辑错误,再逐步切换回容器注入模式。 - 容器补全参考:使用Tomcat插件开发时,如需支持CDI+EJB能力,需要手动在WAR包中集成Weld CDI核心、Weld Servlet扩展依赖,在
web.xml中配置Weld的启动Listener;如果要运行@StatelessEJB,还需要额外集成OpenEJB这类轻量EJB容器,Tomcat原生没有对应实现。
内容的提问来源于stack exchange,提问作者tohhant
相关产品推荐
相关产品推荐

