You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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名称来指定,但手动定义SpringLiquibase Bean的方式更灵活。
  • 测试时可以先打印DataSourceConfig的属性值,确认配置服务器的属性已经正确注入。

内容的提问来源于stack exchange,提问作者Gitesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:47:27