升级Spring Boot2.6.1后ConstructorResolver忽略嵌入式MongoDB版本配置报错
问题根因
Spring Boot 2.6.x版本对嵌入式MongoDB的自动配置逻辑做了拆分调整:原内置在spring-boot-starter-data-mongodb中的嵌入式MongoDB属性绑定、自动配置逻辑被单独抽离为独立的starterspring-boot-starter-data-mongodb-embedded。你当前的pom.xml中没有引入该依赖,导致EmbeddedMongoProperties类没有被Spring上下文识别并加载配置,你在application.properties中写的spring.mongodb.embedded前缀的配置全部无法绑定,属性自然为null,触发版本校验的异常。
解决方案
方案一:补全缺失的依赖(推荐)
在pom.xml的dependencies节点中添加以下依赖,版本会继承你父pom中声明的Spring Boot版本,无需额外指定:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-embedded</artifactId> </dependency>
添加后重新启动项目,你原有application.properties中的配置就会被正常绑定到EmbeddedMongoProperties,异常会自动消除。
方案二:手动声明MongodConfig Bean
如果你不想引入额外的starter,可以直接自定义配置类手动注册MongoDB嵌入式实例的配置Bean,直接指定版本等参数,样例代码如下:
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.runtime.Network; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class EmbeddedMongoConfig { @Bean public MongodConfig mongodConfig() throws Exception { return MongodConfig.builder() .version(Version.V3_6_3) .net(new Net("127.0.0.1", 27017, Network.localhostIsIPv6())) .storage(new Storage("/home/craig/.ca.footeware.web-mongodb/", null, 0)) .build(); } }
注册该Bean后,Spring Boot自动配置会优先使用你自定义的配置,不会再触发版本缺失的校验。
额外提醒
嵌入式MongoDB本身设计为测试环境使用,不推荐在正式生产环境部署:其没有完善的数据持久化保障、不支持集群高可用,故障时数据丢失风险极高,生产环境建议替换为独立部署的MongoDB服务实例。
内容的提问来源于stack exchange,提问作者CraigFoote

