迁移到JBOSS 7.4与Java11后EJB stateless beans注入失败问题咨询
问题诱发原因
- JBoss EAP 7.x 相比JBoss 6调整了CDI默认扫描规则:JBoss 6默认对所有Web模块启用全量CDI扫描,而JBoss 7.4要求Web模块必须存在
WEB-INF/beans.xml配置文件才会被识别为CDI归档,未显式配置的情况下不会扫描Filter类的注入点。 - 容器注入逻辑架构调整:JBoss 6中Filter的EJB注入由EJB容器单独处理,不需要CDI托管即可识别
@Inject注解;JBoss 7.4统一将所有注解注入逻辑交由CDI容器处理,未被CDI托管的Filter实例不会触发注入逻辑,@Inject标注的依赖会保持null。 - 模块类加载隔离规则变更:JBoss 7.4的类加载隔离机制比JBoss 6更严格,如果EJB存放在独立的EJB模块中,Web模块未显式声明模块依赖的话,CDI容器无法扫描到对应的EJB Bean,也会导致注入失败。
解决思路
- 补全CDI配置
在Web模块的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>
如果不需要全量扫描,可以将bean-discovery-mode设置为annotated,同时给XXXFilter添加@ApplicationScoped(javax.enterprise.context.ApplicationScoped)注解,让CDI容器识别并托管Filter实例。
- 校验模块依赖
如果EJB存放在独立的EJB模块中,在Web模块的WEB-INF/jboss-web.xml中添加模块依赖配置,确保Web模块可以访问到EJB类:
<jboss-web> <dependency> <module-name>你的EJB模块名</module-name> <export>true</export> </dependency> </jboss-web>
- 临时兼容方案
如果不想调整CDI相关配置,可以直接将注入EJB的@Inject注解替换为@EJB,JBoss 7.4的EJB容器保留了旧版的注入逻辑,无需CDI托管即可完成EJB注入。
内容的提问来源于stack exchange,提问作者JMBA
相关产品推荐
相关产品推荐

