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

Spring Boot集成liquibase-mongodb扩展执行迁移无效果该如何解决?

Spring Boot 集成 liquibase-mongodb 完整实现方案

1. 依赖配置(pom.xml)

首先确保liquibase核心包和mongodb扩展包版本完全一致,避免兼容问题,参考依赖如下:

<dependencies>
    <!-- Spring Boot MongoDB 启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <!-- Liquibase 核心依赖 -->
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>4.20.0</version>
    </dependency>
    <!-- Liquibase MongoDB 扩展 -->
    <dependency>
        <groupId>org.liquibase.ext</groupId>
        <artifactId>liquibase-mongodb</artifactId>
        <version>4.20.0</version>
    </dependency>
</dependencies>

2. 应用配置(application.yml)

配置MongoDB连接参数和liquibase迁移规则:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017
      database: test_db
# 自定义liquibase mongodb配置
liquibase:
  mongodb:
    enabled: true
    change-log: classpath:db/changelog/db.changelog-master.xml

3. 自定义迁移初始化逻辑

原生SpringLiquibase是为JDBC协议的关系型数据库设计的,必须传入JDBC数据源,MongoDB没有对应的DataSource实现,因此不能使用该类,直接调用Liquibase原生API完成初始化即可,参考代码如下:

import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.ext.mongodb.database.MongoLiquibaseDatabase;
import liquibase.resource.ClassLoaderResourceAccessor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ConditionalOnProperty;
import com.mongodb.client.MongoClient;
import jakarta.annotation.PostConstruct;

@Configuration
@ConditionalOnProperty(name = "liquibase.mongodb.enabled", havingValue = "true", matchIfMissing = true)
public class LiquibaseMongoConfig {

    private final MongoClient mongoClient;
    private final String mongoDbName;
    private final String changelogPath;

    public LiquibaseMongoConfig(MongoClient mongoClient,
                                @Value("${spring.data.mongodb.database}") String mongoDbName,
                                @Value("${liquibase.mongodb.change-log}") String changelogPath) {
        this.mongoClient = mongoClient;
        this.mongoDbName = mongoDbName;
        this.changelogPath = changelogPath;
    }

    @PostConstruct
    public void runMigration() throws Exception {
        // 初始化MongoDB专属的Liquibase数据库实例
        Database database = new MongoLiquibaseDatabase();
        database.setConnection(new liquibase.ext.mongodb.connection.MongoClientConnection(mongoClient, mongoDbName));
        // 加载changelog并执行迁移
        try (Liquibase liquibase = new Liquibase(changelogPath, new ClassLoaderResourceAccessor(), database)) {
            liquibase.update("");
        }
    }
}

4. 常见问题修正

你当前的配置存在两处明显错误:

  • 配置类里填写的changelog路径是classpath:/db/changelog/db.changelog-master.yaml,但你实际的changelog是XML格式,路径不一致会导致迁移不触发
  • 不需要自行实例化SpringLiquibase,该类不适配MongoDB场景
    你提供的XML格式changelog本身没有问题,只要路径和配置文件中保持一致即可正常识别。

5. 运行验证

启动项目后登录MongoDB查看:

  • 自动生成DATABASECHANGELOG、DATABASECHANGELOGLOCK两个系统集合,说明迁移逻辑已触发
  • 存在你定义的myCollection集合,且校验规则生效,说明迁移执行成功

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:06:03