Spring Boot从2.0.1升级至2.7.x时EmbeddedMongoAutoConfiguration报错
解决Spring Boot 2.7.x升级中EmbeddedMongoAutoConfiguration的条件处理错误
你遇到的错误核心原因是Spring Boot 2.7.x自带的EmbeddedMongoAutoConfiguration与flapdoodle embed mongo 3.0.0版本不兼容。flapdoodle 3.x对API做了大幅调整,而Spring Boot 2.7.x的自动配置逻辑仍基于旧版flapdoodle设计,导致条件处理失败。
解决方案
方案1:降级flapdoodle到Spring Boot 2.7.x兼容版本
Spring Boot 2.7.x的依赖管理默认适配flapdoodle 2.2.x系列,直接调整测试依赖版本即可:
<dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <version>2.2.0</version> <scope>test</scope> </dependency>
如果启用Spring Boot依赖管理(推荐),可以省略版本号,让框架自动匹配兼容版本:
<dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <scope>test</scope> </dependency>
方案2:禁用自动配置,手动初始化嵌入式Mongo
若坚持使用flapdoodle 3.0.0,需排除Spring Boot的自动配置类,自行编写配置逻辑:
- 在启动类或测试类中排除自动配置:
@SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class) // 测试类可替换为@SpringBootTest(exclude = EmbeddedMongoAutoConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 编写自定义配置类,适配flapdoodle 3.x API:
import de.flapdoodle.embed.mongo.MongodExecutable; import de.flapdoodle.embed.mongo.MongodProcess; import de.flapdoodle.embed.mongo.MongodStarter; import de.flapdoodle.embed.mongo.config.MongodConfig; import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.runtime.Network; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import java.io.IOException; @Configuration @Profile("test") public class EmbeddedMongoConfig { private MongodProcess mongodProcess; @Bean(destroyMethod = "stop") public MongodProcess mongodProcess() throws IOException { MongodStarter starter = MongodStarter.getDefaultInstance(); MongodConfig mongodConfig = MongodConfig.builder() .version(Version.Main.PRODUCTION) .net(new Net("localhost", 27017, Network.localhostIsIPv6())) .build(); MongodExecutable mongodExecutable = starter.prepare(mongodConfig); mongodProcess = mongodExecutable.start(); return mongodProcess; } }
额外建议
你测试依赖中使用的info.cukes系列Cucumber已停止维护,建议替换为io.cucumber的兼容版本,避免和Spring Boot 2.7.x冲突:
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>7.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-spring</artifactId> <version>7.11.0</version> <scope>test</scope> </dependency>
内容的提问来源于stack exchange,提问作者Ragnar_viking
相关产品推荐
相关产品推荐

