Spring Boot 3.2.3集成ProxyDataSource与Liquibase报错UnsupportedDataSourcePropertyException
问题分析与解决方案
问题原因
启用datasource-proxy后,Spring Boot的主数据源被包装为ProxyDataSource。当未显式配置spring.liquibase.url时,Liquibase自动配置会通过DataSourceBuilder尝试基于主数据源的属性构建迁移数据源,但ProxyDataSource并未暴露setUrl这类属性设置方法,导致反射调用失败,抛出UnsupportedDataSourcePropertyException异常。
可行解决方案
方案1:显式配置Liquibase数据源信息
直接在application.properties中添加Liquibase的URL配置,让Liquibase使用独立的数据源配置,避免依赖代理数据源的反射属性:
spring.liquibase.url=jdbc:h2:mem:test
方案2:自定义Liquibase Bean,使用原始数据源
通过配置类获取代理数据源背后的原始Hikari数据源,直接注入给Liquibase,绕过反射问题:
import liquibase.integration.spring.SpringLiquibase; import net.ttddyy.dsproxy.support.ProxyDataSource; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class LiquibaseConfig { @Bean public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties properties) { // 剥离代理,获取原始数据源 DataSource targetDataSource = dataSource; if (dataSource instanceof ProxyDataSource) { targetDataSource = ((ProxyDataSource) dataSource).getTargetDataSource(); } SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(targetDataSource); liquibase.setChangeLog(properties.getChangeLog()); liquibase.setContexts(properties.getContexts()); liquibase.setDefaultSchema(properties.getDefaultSchema()); liquibase.setDropFirst(properties.isDropFirst()); liquibase.setShouldRun(properties.isEnabled()); liquibase.setLabels(properties.getLabels()); liquibase.setChangeLogParameters(properties.getParameters()); liquibase.setRollbackFile(properties.getRollbackFile()); return liquibase; } }
方案3:升级datasource-proxy版本
当前使用的1.10版本对Spring Boot 3.x的兼容性可能不足,升级到最新稳定版(如1.13.0及以上),新版本可能修复了数据源代理与Liquibase自动配置的适配问题:
<dependency> <groupId>net.ttddyy</groupId> <artifactId>datasource-proxy</artifactId> <version>1.13.0</version> </dependency>
内容的提问来源于stack exchange,提问作者user29484920
相关产品推荐
相关产品推荐

