Quarkus与JDBI集成报错:@Default修饰的javax.sql.DataSource依赖不满足
问题根因
Quarkus 2.x 调整了扩展扫描与JDBC数据源的初始化逻辑:
- 2.1.3.Final版本中,仅将JDBC驱动依赖设为
runtimeOnly时,构建阶段的Arc容器扫描无法检测到JDBC扩展,不会自动初始化默认DataSource的Bean,因此注入时报找不到依赖的错误。 - 2.2.1.Final版本修复了主程序启动时的扩展扫描逻辑,但测试环境的类加载逻辑独立,依旧会出现扫描不到JDBC扩展的问题。
1.13.x版本未做上述逻辑调整,因此配置可以正常运行。
解决方案
方案1:调整JDBC依赖的scope
将JDBC驱动的依赖从runtimeOnly修改为implementation,让构建阶段可以检测到JDBC扩展,自动初始化DataSource:
dependencies { implementation(enforcedPlatform("io.quarkus:quarkus-universe-bom:2.2.1.Final")) implementation(enforcedPlatform("org.jdbi:jdbi3-bom:3.21.0")) implementation("org.jdbi:jdbi3-core") implementation("org.jdbi:jdbi3-sqlobject") // 修改此处依赖scope implementation("io.quarkus:quarkus-jdbc-h2") runtimeOnly("io.quarkus:quarkus-config-yaml") runtimeOnly("io.quarkus:quarkus-flyway") ... }
方案2:强制开启JDBC支持
如果不想调整依赖scope,可在配置文件中添加配置强制启用JDBC支持:
quarkus: datasource: db-kind: "h2" jdbc: enabled: true # 新增此行配置 url: "jdbc:h2:mem:java_quarkus_graphql;DB_CLOSE_DELAY=-1;MODE=PostgreSQL" username: "sa" flyway: clean-disabled: true locations: "classpath:database/migration" migrate-at-start: true validate-on-migrate: true
测试场景额外排查项
如果调整后主程序正常但测试依旧报错,检查以下两项:
- 确认
src/test/resources下存在正确的数据源配置文件,测试环境默认优先读取该目录下的配置。 - 确认自定义
@QuarkusTransactionalTest注解中的@Transactional导入的是javax.transaction.Transactional,而非Spring框架的事务注解。
内容的提问来源于stack exchange,提问作者user4695271
相关产品推荐
相关产品推荐

