Spring Boot集成Liquibase时从配置服务器获取属性配置自定义DataSource的方法
没问题,你的思路方向是对的,但有几个细节需要调整,而且要明确Liquibase和自定义DataSource的配合方式,我来一步步给你梳理清楚:
Spring Boot中通过配置服务器为Liquibase配置自定义DataSource
1. 先修正你的DataSourceConfig类
首先要确保POJO的属性和配置服务器里的db前缀属性能正确绑定,你原来的代码里有个小细节:属性名userName改成username更规范(避免Spring属性绑定的大小写匹配问题),同时要保证getter/setter的正确性:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "db") public class DataSourceConfig { private String url; private String username; // 改为username,和配置前缀的属性名匹配更友好 private String secret; // Getters & Setters public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSecret() { return secret; } public void setSecret(String secret) { this.secret = secret; } }
2. 正确创建自定义DataSource Bean
你原来的代码有两处小问题:DataSourceBuilder的方法名是username()而非userName(),且遗漏了设置数据库url,同时要注意注入的配置类拼写(你之前写的dataSourcConfig少了个e)。正确写法如下:
import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class CustomDataSourceConfig { private final DataSourceConfig dataSourceConfig; // 通过构造注入配置类 public CustomDataSourceConfig(DataSourceConfig dataSourceConfig) { this.dataSourceConfig = dataSourceConfig; } @Bean public DataSource dataSource() { return DataSourceBuilder.create() .url(dataSourceConfig.getUrl()) .username(dataSourceConfig.getUsername()) .password(dataSourceConfig.getSecret()) .driverClassName("com.mysql.cj.jdbc.Driver") // 可选,如果Spring无法自动检测驱动时添加 .build(); } }
3. 配置Liquibase使用自定义DataSource
因为你自定义了DataSource,Spring Boot默认的Liquibase自动配置不会自动关联这个Bean,所以需要手动定义SpringLiquibase Bean,把自定义DataSource注入进去,同时指定你的changelog文件路径:
import liquibase.integration.spring.SpringLiquibase; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class LiquibaseConfig { private final DataSource dataSource; public LiquibaseConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public SpringLiquibase liquibase() { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:db/changelog/db.changelog-master.yaml"); // 替换成你的changelog实际路径 // 可选配置:比如指定环境上下文、默认schema等 // liquibase.setContexts("dev"); // liquibase.setDefaultSchema("demo"); return liquibase; } }
4. 确保配置服务器属性正确拉取
要让应用成功从配置服务器获取db前缀的属性,还需要做以下配置:
- 添加Spring Cloud Config Client依赖(如果使用Spring Cloud体系),比如在pom.xml中:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 在
application.properties(或bootstrap.properties,取决于Spring Cloud版本)中配置配置服务器地址:
spring.cloud.config.uri=http://你的配置服务器地址:端口 spring.cloud.config.name=你的配置文件名称(比如db-config) spring.cloud.config.profile=dev(根据你的环境调整)
关键注意点
- 如果你不想完全禁用默认Liquibase自动配置,也可以通过
spring.liquibase.data-source=自定义DataSource的Bean名称来指定,但手动定义SpringLiquibaseBean的方式更灵活。 - 测试时可以先打印
DataSourceConfig的属性值,确认配置服务器的属性已经正确注入。
内容的提问来源于stack exchange,提问作者Gitesh
相关产品推荐
相关产品推荐

