TomEE部署WAR触发Filter时提示找不到LoginService Bean求解决
检查DeltaSpike与TomEE版本兼容性
不同版本的DeltaSpike和TomEE(尤其是内置的OpenEJB/Cdi容器)存在兼容性约束,比如DeltaSpike 1.9+需搭配TomEE 7.0+,DeltaSpike 2.x对应TomEE 8+,确认使用的版本组合符合官方推荐要求。验证beans.xml的位置与配置
确保beans.xml放在WEB-INF/目录下,配置需正确声明CDI模式,示例:<?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_1_1.xsd" bean-discovery-mode="all"> </beans>若
bean-discovery-mode设为annotated,需保证LoginService实现类带有@ApplicationScoped等CDI scope注解,且能被DeltaSpike识别。确认LoginService实现类的注解与包扫描
检查LoginService实现类是否带有@Dependent/@ApplicationScoped等CDI scope注解,同时:- 实现类需与接口在同一包,或确保beans.xml的扫描范围覆盖实现类所在包;
- 因注入时限定符为空,实现类不能额外添加自定义限定符注解。
检查Filter的CDI注入方式
确保LoginFilter中注入LoginService的方式正确,示例:@Inject private LoginService loginService;必须使用CDI的
@Inject,禁止用@EJB或手动实例化;同时LoginFilter本身需被CDI管理,比如添加@WebFilter注解,或在web.xml中配置的Filter类带有@RequestScoped等CDI scope注解。验证TomEE的CDI启用状态
检查TomEE配置文件(conf/system.properties或conf/tomee.xml),确认CDI功能已启用:- 确保
openejb.cdi.enabled=true(默认开启,但可能被修改); - 若使用TomEE Web Profile版本,需确认已添加CDI相关依赖。
- 确保
检查WAR包的依赖打包情况
确保DeltaSpike核心依赖(deltaspike-core-api和deltaspike-core-impl)已正确打包到WAR的WEB-INF/lib目录;用Maven/Gradle依赖树排查是否存在DeltaSpike或CDI API的版本冲突。查看TomEE启动日志
开启TomEE DEBUG级别日志,搜索LoginService或DeltaSpike相关记录:- 若日志未显示LoginService实现类被CDI容器发现,说明包扫描或注解配置有问题;
- 若有注册记录但Filter注入失败,可能是Filter在CDI容器初始化前被实例化。
检查Filter的加载顺序
在web.xml中配置Filter时,确保其加载顺序在CDI容器初始化之后;或改用@WebFilter注解让容器自动管理加载顺序;避免在Filter的init()方法中调用注入的LoginService,应移至doFilter()方法中使用。
内容的提问来源于stack exchange,提问作者Stef

