@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
相关产品推荐
相关产品推荐

