Spring Boot 2.7升级至3.1.1的Embedded Mongo迁移问题
Spring Boot 3.1.1 迁移 Flapdoodle Embedded MongoDB 方案
1. 依赖调整
完全移除旧依赖de.flapdoodle.embed:de.flapdoodle.embed.mongo:3.5.0,添加适配Spring Boot 3.x的专用包:
<!-- Maven 依赖 --> <dependency> <groupId>flapdoodle.embed</groupId> <artifactId>flapdoodle.embed.mongo.spring30x</artifactId> <version>4.5.2</version> <scope>test</scope> <!-- 仅测试环境使用时添加 --> </dependency>
若存在传递依赖冲突,可显式排除旧核心包:
<dependency> <groupId>flapdoodle.embed</groupId> <artifactId>flapdoodle.embed.mongo.spring30x</artifactId> <version>4.5.2</version> <exclusions> <exclusion> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> </exclusion> </exclusions> </dependency>
2. 包路径与类结构变更
旧版本核心类的包路径和构建逻辑已调整,对应替换关系:
MongodStarter、MongodExecutable、MongoProcess:仍在de.flapdoodle.embed.mongo包,实例化方式不变Defaults:已拆分,原默认配置需通过Builder模式手动构建MongodConfig:移至de.flapdoodle.embed.mongo.config包,改为接口,需用MongodConfig.builder()创建RuntimeConfig:移至de.flapdoodle.embed.process.runtime包,同样通过Builder模式构建
3. 代码适配示例
重构后的EmbeddedMongoServer实现:
import de.flapdoodle.embed.mongo.MongodExecutable; import de.flapdoodle.embed.mongo.MongodStarter; import de.flapdoodle.embed.mongo.MongoProcess; import de.flapdoodle.embed.mongo.config.MongodConfig; import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.config.Storage; import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.config.io.ProcessOutputs; import de.flapdoodle.embed.process.runtime.Network; import de.flapdoodle.embed.process.runtime.RuntimeConfig; import java.io.IOException; public class EmbeddedMongoServer { private MongodExecutable mongodExecutable; private MongoProcess mongoProcess; private final int port = 27017; public void start() throws IOException { // 构建运行时配置,替代旧版Defaults.runtimeConfig() RuntimeConfig runtimeConfig = RuntimeConfig.builder() .processOutput(ProcessOutputs.logToConsole()) .build(); // 构建MongoDB实例配置,替代旧版Defaults.mongodConfig() MongodConfig mongodConfig = MongodConfig.builder() .version(Version.Main.PRODUCTION) // 可指定具体版本如V6_0、V7_0 .net(Net.of("localhost", port, Network.localhostIsIPv6())) .storage(Storage.of("target/embedded-mongodb-data")) // 数据存储路径 .build(); MongodStarter starter = MongodStarter.getInstance(runtimeConfig); mongodExecutable = starter.prepare(mongodConfig); mongoProcess = mongodExecutable.start(); } public void stop() { if (mongoProcess != null) { mongoProcess.stop(); } if (mongodExecutable != null) { mongodExecutable.stop(); } } public String getConnectionString() { return String.format("mongodb://localhost:%d/test", port); } }
4. 简化方案:使用Spring Boot自动配置
无需手动编写EmbeddedMongoServer类,依赖Spring Boot自动配置即可:
- 保持上述依赖不变
- 在配置文件中添加参数:
# 指定嵌入式MongoDB端口 spring.data.mongodb.port=27017 # 指定MongoDB版本(可选) spring.embedded.mongo.version=6.0.10
Spring Boot会自动创建并管理MongoDB实例,测试时直接注入MongoTemplate即可使用。
5. 额外注意事项
- 确保项目完全迁移至Jakarta EE API(Spring Boot 3.x要求),无遗留
javax.*依赖 - 匹配Spring Data MongoDB版本:Spring Boot 3.1.1对应Spring Data MongoDB 4.1.1,避免版本冲突
- 自定义MongoDB版本时,需使用
Version类提供的枚举值,如Version.V6_0
内容的提问来源于stack exchange,提问作者DHARMIK SONI
相关产品推荐
相关产品推荐

