Spring Boot升级至2.5.2后无法实例化自定义库DataSource的问题如何解决?
根因分析
Spring Boot 2.5.x对DataSource初始化逻辑做了两处关键变更,直接触发了该问题:
DataSourceBuilder在注入属性时,只要配置了对应属性但目标数据源类没有对应的setter方法,会直接抛出UnsupportedDataSourcePropertyException,而2.4.x版本会直接忽略不存在的属性DataSourceAutoConfiguration的注册优先级逻辑调整,导致你自定义的RoutingDataSourceAutoConfiguration虽然配置了AutoConfigureBefore,但在Flyway等依赖DataSource的组件触发初始化时,Spring还是优先尝试加载自带的Generic数据源配置
你配置了spring.datasource.url,而自定义的RoutingDataSource类没有setUrl()方法,Spring尝试给指定类型的数据源注入url属性的时候就直接报错。
修复方案
可以按需选择以下任意一种方案:
方案一:补充空实现的通用属性setter(最兼容,适合公共库场景)
在你的RoutingDataSource类中添加spring.datasource通用属性的空实现setter,Spring注入时不会报错,你初始化数据源时也用不到这些属性,不会影响原有逻辑:
class RoutingDataSource : AbstractRoutingDataSource() { // 追加以下空setter即可 fun setUrl(url: String) {} fun setUsername(username: String) {} fun setPassword(password: String) {} fun setDriverClassName(driverClassName: String) {} // 原有逻辑保持不变 fun initDataSources(config: RoutingDataSourceConfig) { // ... } }
方案二:提升自定义自动配置优先级
给你的RoutingDataSourceAutoConfiguration类添加最高优先级注解,确保你的DataSource先被创建,Spring自带的数据源配置因为@ConditionalOnMissingBean就不会执行:
@Configuration @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 新增这行 @ConditionalOnProperty( name = ["spring.datasource.type"], havingValue = "org.example.datasource.connector.RoutingDataSource", matchIfMissing = true ) // 其余注解保持不变 class RoutingDataSourceAutoConfiguration{ // 原有逻辑保持不变 }
方案三:移除通用数据源配置项
如果是业务项目自用,直接删除YAML里的spring.datasource.url配置即可,你的配置里已经在routing节点下配置了读写库的jdbcUrl,不需要顶层的url配置,Spring自然不会尝试注入不存在的url属性。
内容的提问来源于stack exchange,提问作者Nikita Medvedev
相关产品推荐
相关产品推荐

