Spring Boot禁用R2dbcAutoConfiguration失败,自定义ConnectionFactory冲突
解决R2dbc自动配置ConnectionFactory冲突问题
问题根源
仅排除R2dbcAutoConfiguration仍出现冲突,核心原因包括:
- 自定义配置类上的
@EnableAutoConfiguration注解干扰了主启动类的排除逻辑 - 自动配置扫描顺序导致
R2dbcAutoConfiguration的排除未生效 - 池化连接工厂配置类(
PooledConnectionFactoryConfiguration)作为R2dbcAutoConfiguration的内部类,未被完全拦截
解决方案
1. 修正配置类与主启动类注解
首先移除自定义配置类上的@EnableAutoConfiguration(exclude = ...),并添加@Configuration注解确保Spring识别为配置类:
@Configuration @EnableConfigurationProperties(R2dbcProperties.class) @ConditionalOnResource(resources = "classpath:META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider") public class CustomR2dbcAutoConfiguration { @Bean public ConnectionFactory connectionFactory() { return ConnectionFactories.get("r2dbc:postgresql://test:test@localhost:5432/test"); } }
然后在主启动类的@SpringBootApplication中统一排除R2dbcAutoConfiguration:
@SpringBootApplication(exclude = {R2dbcAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
2. 全局配置排除(备选方案)
若注解排除未生效,可在application.properties或application.yml中添加全局自动配置排除:
# application.properties spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration
# application.yml spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration
3. 显式排除池化连接工厂配置类(极端情况)
如果上述方法仍无效,可直接排除内部的池化配置类(注意类名需匹配Spring Boot版本):
@SpringBootApplication(exclude = { R2dbcAutoConfiguration.class, org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations.PoolConfiguration.PooledConnectionFactoryConfiguration.class }) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
验证
启动应用后,检查日志确认PooledConnectionFactoryConfiguration不再创建connectionFactory Bean,同时自定义ConnectionFactory正常注册即可。
内容的提问来源于stack exchange,提问作者kylie.zoltan
相关产品推荐
相关产品推荐

