You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移到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,也会导致注入失败。
解决思路
  1. 补全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实例。

  1. 校验模块依赖
    如果EJB存放在独立的EJB模块中,在Web模块的WEB-INF/jboss-web.xml中添加模块依赖配置,确保Web模块可以访问到EJB类:
<jboss-web>
    <dependency>
        <module-name>你的EJB模块名</module-name>
        <export>true</export>
    </dependency>
</jboss-web>
  1. 临时兼容方案
    如果不想调整CDI相关配置,可以直接将注入EJB的@Inject注解替换为@EJB,JBoss 7.4的EJB容器保留了旧版的注入逻辑,无需CDI托管即可完成EJB注入。

内容的提问来源于stack exchange,提问作者JMBA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:36:05