Quarkus CDI无法找到ApplicationScoped Bean构建失败求助
问题:Quarkus多模块项目中Repository依赖注入失败,构建抛出
UnsatisfiedResolutionException 编译Quarkus应用时,quarkus-maven-plugin抛出依赖注入异常,提示无法找到SampleDaoRepository的实现,构建失败。错误日志如下:
[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:3.12.0:build (default) on project sample-monitor-service: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [ERROR] [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type com.foo.db.SampleDaoRepository and qualifiers [@Default] [ERROR] - injection target: parameter 'sampleDaoRepository' of com.foo.service.SampleManager constructor [ERROR] - declared on CLASS bean [types=[com.foo.service.SampleManager, java.lang.Object], qualifiers=[@Default, @Any], target=com.foo.service.SampleManager] [ERROR] at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1546) [ERROR] at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338) [ERROR] at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:167) [ERROR] at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:490) [ERROR] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [ERROR] at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849) [ERROR] at io.quarkus.builder.BuildContext.run(BuildContext.java:256) [ERROR] at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495) [ERROR] at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521) [ERROR] at java.base/java.lang.Thread.run(Thread.java:1583) [ERROR] at org.jboss.threads.JBossThread.run(JBossThread.java:483) [ERROR] Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type com.foo.db.SampleDaoRepository and qualifiers [@Default] [ERROR] - injection target: parameter 'sampleDaoRepository' of com.foo.service.SampleManager constructor [ERROR] - declared on CLASS bean [types=[com.foo.service.SampleManager, java.lang.Object], qualifiers=[@Default, @Any], target=com.foo.service.SampleManager] [ERROR] at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519) [ERROR] at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642) [ERROR] at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:323) [ERROR] ... 12 more [ERROR] -> [Help 1]
项目结构
基于Java 21的Maven多模块项目,父项目为sample-monitor:
sample-monitor-db:存放DAO实体和Repository类sample-monitor-service:存放业务逻辑和定时任务Bean
核心代码文件
父项目pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.foo</groupId> <artifactId>sample-monitor</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>sample-monitor-service</module> <module>sample-monitor-db</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus.platform</groupId> <artifactId>quarkus-bom</artifactId> <version>3.12.0</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.foo</groupId> <artifactId>sample-monitor-db</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
sample-monitor-db/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.foo</groupId> <artifactId>sample-monitor</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>sample-monitor-db</artifactId> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm-panache</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>io.quarkus</groupId> <artifactId>quarkus-panache-common</artifactId> <version>${quarkus.platform.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> </project>
SampleDao.java
package com.foo.db; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity @Table(name = "sample") public class SampleDao { @Id private String id; private String name; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public String getId() { return id; } public String getName() { return name; } }
SampleDaoRepository.java
package com.foo.db; import io.quarkus.hibernate.orm.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class SampleDaoRepository implements PanacheRepository<SampleDao> { }
sample-monitor-service/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.foo</groupId> <artifactId>sample-monitor</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>sample-monitor-service</artifactId> <dependencies> <dependency> <groupId>com.foo</groupId> <artifactId>sample-monitor-db</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-scheduler</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>io.quarkus</groupId> <artifactId>quarkus-panache-common</artifactId> <version>${quarkus.platform.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>io.quarkus.platform</groupId> <artifactId>quarkus-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
SampleManager.java
package com.foo.service; import com.foo.db.SampleDaoRepository; import io.quarkus.scheduler.Scheduled; import jakarta.inject.Singleton; @Singleton public class SampleManager { private SampleDaoRepository sampleDaoRepository; public SampleManager(SampleDaoRepository sampleDaoRepository) { this.sampleDaoRepository = sampleDaoRepository; } @Scheduled(every = "2m") public void countAll() { System.out.println("Counted " + sampleDaoRepository.count() + " records"); } }
原因分析
- Quarkus扩展缺失:
sample-monitor-service模块依赖sample-monitor-db,但未引入Hibernate ORM和Panache相关扩展。Quarkus的CDI容器需要这些扩展识别@ApplicationScoped标记的Repository类,并生成Panache Repository的代理实现,否则无法将Repository纳入CDI上下文。 - 模块构建顺序问题:父项目modules列表先声明
sample-monitor-service,后声明sample-monitor-db,Maven会优先构建service模块,此时db模块可能未完成编译,导致service模块无法正确识别db模块中的类(此问题通常表现为编译错误,优先级低于第一个原因)。
解决方法
方法1:在service模块添加必要的Quarkus扩展
修改sample-monitor/sample-monitor-service/pom.xml的dependencies节点,补充Hibernate ORM和Panache依赖:
<dependencies> <dependency> <groupId>com.foo</groupId> <artifactId>sample-monitor-db</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-scheduler</artifactId> </dependency> <!-- 添加以下两个依赖 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm-panache</artifactId> </dependency> </dependencies>
方法2:调整模块构建顺序(辅助优化)
修改父项目sample-monitor/pom.xml的modules顺序,先构建db模块再构建service模块:
<modules> <module>sample-monitor-db</module> <module>sample-monitor-service</module> </modules>
验证步骤
- 清理构建产物:执行
mvn clean - 重新构建项目:执行
mvn install - 启动应用:执行
mvn quarkus:dev,检查定时任务是否正常输出统计结果
内容的提问来源于stack exchange,提问作者Robert K
相关产品推荐
相关产品推荐

