Spring Boot整合Spring Data R2DBC与jOOQ:找不到Configuration Bean
Spring Boot + Spring Data R2DBC + jOOQ 启动报错:找不到org.jooq.Configuration Bean
问题描述
基于Spring Boot、Spring Data R2DBC和jOOQ搭建测试项目,jOOQ已成功生成相关类,但应用启动失败,报错信息如下:
Parameter 0 of constructor in ...generated.jooq.tables.daos.CountryDao required a bean of type 'org.jooq.Configuration' that could not be found.
配置文件(application.yaml)
spring: r2dbc: url: r2dbc:postgresql:://localhost:5432/test username: 'test' password: 'test' flyway: enabled: true url: jdbc:postgresql://localhost:5432/test user: 'test' password: 'test' encoding: utf-8 validate-migration-naming: true
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>test</artifactId> <version>0.0.1-SNAPSHOT</version> <name>test</name> <description>test</description> <properties> <java.version>17</java.version> <jooq.version>3.18.4</jooq.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jooq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>r2dbc-postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jooq</groupId> <artifactId>jooq-meta-extensions</artifactId> <version>${jooq.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <executions> <execution> <id>jooq-codegen</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!-- ... --> </configuration> </plugin> </plugins> </build> </project>
已尝试的解决方法
- 添加
@EnableR2dbcRepositories注解 - 调整配置文件参数
均未解决问题。
问题原因
Spring Boot的jOOQ自动配置默认适配JDBC数据源,而当前使用的是R2DBC响应式数据源,两者不兼容,导致Spring无法自动生成org.jooq.Configuration类型的Bean。
解决方案
1. 添加jOOQ R2DBC依赖
在pom.xml中加入jOOQ的R2DBC扩展依赖:
<dependency> <groupId>org.jooq</groupId> <artifactId>jooq-r2dbc</artifactId> <version>${jooq.version}</version> </dependency>
2. 手动创建jOOQ Configuration Bean
编写配置类,基于R2DBC的ConnectionFactory构建适配的jOOQ配置:
import org.jooq.Configuration; import org.jooq.SQLDialect; import org.jooq.impl.DefaultConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.r2dbc.connection.R2dbcTransactionManager; import reactor.core.publisher.Mono; @Configuration public class JooqR2dbcConfig { @Bean public Configuration jooqConfiguration(ConnectionFactory connectionFactory) { DefaultConfiguration configuration = new DefaultConfiguration(); // 设置PostgreSQL方言 configuration.setSQLDialect(SQLDialect.POSTGRES); // 绑定R2DBC连接工厂 configuration.set(connectionFactory); // 配置事务管理器(需要事务支持时添加) configuration.set(new R2dbcTransactionProvider(new R2dbcTransactionManager(connectionFactory))); return configuration; } // 适配jOOQ的TransactionProvider接口 private static class R2dbcTransactionProvider implements org.jooq.TransactionProvider { private final R2dbcTransactionManager transactionManager; public R2dbcTransactionProvider(R2dbcTransactionManager transactionManager) { this.transactionManager = transactionManager; } @Override public void begin(TransactionContext ctx) { transactionManager.startTransaction(Mono.empty()).block(); } @Override public void commit(TransactionContext ctx) { transactionManager.commit(Mono.empty()).block(); } @Override public void rollback(TransactionContext ctx) { transactionManager.rollback(Mono.empty()).block(); } } }
3. 修复R2DBC URL错误
配置文件中R2DBC URL多了一个冒号,修正为:
spring: r2dbc: url: r2dbc:postgresql://localhost:5432/test
4. 移除冗余JDBC依赖(可选)
如果项目不需要JDBC支持,可移除spring-boot-starter-data-jdbc依赖,避免冲突:
<!-- 移除该依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Kassec
相关产品推荐
相关产品推荐

