主Quarkus项目调用子Quarkus项目服务时@Inject注入失败问题咨询
解决Quarkus主项目注入子项目CDI Bean失败的问题
你遇到的问题本质是主项目的CDI容器没有扫描到子项目中的@ApplicationScoped Bean,导致注入时找不到依赖;而手动new实例的话,对象脱离了CDI容器管理,内部的@Inject依赖(比如MongoClient)自然也不会被容器初始化。
下面是具体的解决步骤:
1. 确保子项目是合规的Quarkus模块
子项目的pom.xml需要正确引入Quarkus核心依赖,保证Bean能被CDI容器识别:
- 如果是Maven子模块,继承Quarkus父POM:
<parent> <groupId>io.quarkus</groupId> <artifactId>quarkus-bom</artifactId> <version>${quarkus.version}</version> <type>pom</type> <scope>import</scope> </parent>
- 至少引入
quarkus-core依赖:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-core</artifactId> </dependency>
2. 配置主项目扫描子项目的Bean
主项目默认只会扫描自身包下的CDI Bean,需要显式配置扫描子项目的包路径:
在主项目的src/main/resources/application.properties中添加:
# 替换为子项目的实际包路径,多个包用逗号分隔 quarkus.cdi.beans-discovery-include=com.your.subproject.package
3. 检查主项目对子项目的依赖配置
确保主项目的pom.xml正确依赖子项目,依赖范围设置为compile:
<dependency> <groupId>your-group-id</groupId> <artifactId>subproject-artifact-id</artifactId> <version>your-version</version> <scope>compile</scope> </dependency>
4. 验证子项目Bean的注解正确性
确保子项目中的Bean使用了正确的@ApplicationScoped注解:
- Quarkus 3.x及以上版本用
jakarta.enterprise.context.ApplicationScoped - Quarkus 2.x及以下版本用
javax.enterprise.context.ApplicationScoped
不要导入错误的包,否则CDI容器无法识别该Bean。
为什么new实例不行?
用new关键字创建的对象不属于CDI容器管理范畴,容器不会自动注入该对象内部的@Inject依赖(比如MongoClient),这些依赖会保持为null,自然无法正常工作。只有通过@Inject或CDI容器获取的Bean,其内部的依赖才会被容器自动初始化。
内容的提问来源于stack exchange,提问作者user3577622
相关产品推荐
相关产品推荐

