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

@Stateless Bean中使用限定符时构造函数注入失效问题

解决WebLogic 12.2.1.3.0中带限定符的构造函数注入失效问题

我之前在WebLogic 12c环境里踩过一模一样的坑!给你几个实用的排查和解决方向:

1. 先检查限定符的定义是否规范

确保你的@MainButler和@Assistant是标准的CDI限定符,必须包含以下元注解,缺一不可:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, PARAMETER, FIELD})
public @interface MainButler {}

要是限定符缺了这些元注解,WebLogic的CDI容器根本识别不了,注入自然会失效。

2. 确认Butler实现类的限定符标注正确

每个Butler的实现类都要对应加上限定符注解,比如:

@Stateless
@MainButler
public class MainButlerImpl implements Butler {}

@Stateless
@Assistant
public class AssistantButlerImpl implements Butler {}

如果实现类没加对应的限定符,CDI找不到匹配的Bean,构造函数注入肯定出问题。

3. 检查项目的CDI配置文件

WebLogic 12.2.1.x默认支持CDI,但如果项目里没有beans.xml或者配置不对,会导致CDI功能异常:

  • 确保在Web项目的WEB-INF目录下,或者EJB项目的META-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_1_1.xsd"
       version="1.1" bean-discovery-mode="all">
</beans>

注意bean-discovery-mode设为all,这样CDI会扫描所有带注解的Bean。

4. 尝试替换注入方式(WebLogic特定兼容性问题)

部分版本的WebLogic对EJB的构造函数注入存在bug,尤其是同时使用@Stateless和@Inject构造函数的场景。可以先换成字段注入验证:

@Slf4j
@Stateless
public class Salutatory {
    @Inject @MainButler
    private Butler butler;
    @Inject @Assistant
    private Butler assistant;

    public Salutatory() {}
    
    // 业务方法...
}

如果字段注入能正常工作,那大概率是WebLogic的构造函数注入支持问题,这时候可以考虑用字段注入替代,或者升级WebLogic到12.2.1.4.0及以上版本修复该bug。

5. 查看WebLogic日志定位问题

开启CDI调试日志,能帮你找到具体的错误原因:
在WebLogic域的config/logging.xml中添加以下日志器:

<logger name="javax.enterprise.inject" level="DEBUG"/>
<logger name="org.jboss.weld" level="DEBUG"/>

重启服务器后,查看日志里是否有“找不到Bean”“限定符不匹配”之类的错误信息,这些细节能快速定位问题根源。

内容的提问来源于stack exchange,提问作者Tamás Juhász

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:11