Spring Boot嵌入式Mongo启动失败 MongoClientSettings初始化错误
问题定位
核心报错为java.lang.NoClassDefFoundError: org/bson/codecs/EnumCodecProvider,属于典型的MongoDB相关依赖版本冲突+错误引入废弃组件导致的类缺失问题,具体诱因有三点:
- 引入的
cz.jirutka.spring:embedmongo-spring:1.3.1为2016年就停止维护的废弃组件,会传递引入3.x早期版本的MongoDB Java驱动,该版本自带的bson包不存在EnumCodecProvider类,和Spring Boot 2.6.6默认依赖的4.x版本Mongo驱动完全不兼容。 - Flapdoodle版本配置错误:
spring.mongodb.embedded.version=3.4.6错填为Flapdoodle组件自身版本,该配置项实际用于指定嵌入式启动的MongoDB数据库版本,而非组件版本;同时手动指定的de.flapdoodle.embed:de.flapdoodle.embed.mongo:3.4.6和Spring Boot 2.6.6官方适配的版本不匹配。 - 依赖传递冲突未处理:废弃组件引入的低版本bson、Mongo驱动包覆盖了Spring Boot官方管控的高版本依赖,导致初始化
MongoClientSettings时找不到对应类,触发Bean创建失败的连锁报错。
修复方案
按以下步骤调整配置即可:
- 移除pom.xml中废弃的jirutka嵌入式Mongo依赖,删除以下代码块:
<dependency> <groupId>cz.jirutka.spring</groupId> <artifactId>embedmongo-spring</artifactId> <version>1.3.1</version> </dependency>
Spring Boot 2.6.x已原生支持Flapdoodle嵌入式Mongo的自动配置,无需额外引入该老旧组件。
2. 修正Flapdoodle依赖配置,移除手动指定的版本号,交由Spring Boot父POM统一管理兼容版本,将原有Flapdoodle依赖替换为:
<dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <scope>runtime</scope> </dependency>
- 修正application.properties中的嵌入式Mongo版本配置,将
spring.mongodb.embedded.version改为实际需要启动的MongoDB数据库版本,推荐使用和驱动兼容的4.0.x稳定版,修正后配置如下:
spring.data.mongodb.host=localhost spring.data.mongodb.port=27018 spring.data.mongodb.database=homecooking-messaging spring.mongodb.embedded.version=4.0.21
- 执行Maven命令清理旧依赖缓存并重新构建:
mvn clean install -U
如果构建后仍存在依赖冲突,可通过IDE的Maven依赖分析工具排查所有引入的bson、mongodb-driver包,将所有3.x版本的旧依赖全部排除即可,正常移除jirutka组件后不会再出现版本覆盖问题。
验证标准
项目启动时日志中出现嵌入式Mongo启动成功提示,无类找不到报错,mongoTemplate、chatMessageRepository等Bean正常初始化完成即为修复成功。
内容的提问来源于stack exchange,提问作者Ignacio Estevo
相关产品推荐
相关产品推荐

