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
相关产品推荐
相关产品推荐

