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

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自动配置即可:

  1. 保持上述依赖不变
  2. 在配置文件中添加参数:
# 指定嵌入式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:37:32