Spring Boot 2.5.2下MongoDB Map键含点号报错且替换配置不生效问题
配置失效原因与解决方案
失效原因
Spring Boot 2.3.x及更高版本对MongoDB的自动配置逻辑做了调整,直接自定义MappingMongoConverter Bean的方式已经无法覆盖默认配置:默认初始化的MongoTemplate不会优先使用你手动创建的MappingMongoConverter实例,且手动new的转换器没有加载Spring Boot默认配置的类型转换、映射规则等内容,最终导致你的点号替换配置不生效。
解决方案
方案一(优先推荐):使用MongoCustomizer修改配置
Spring Boot 2.3+ 新增了MongoCustomizer扩展点,专门用于调整自动配置好的MappingMongoConverter属性,不会覆盖原有默认配置,仅修改你需要自定义的规则,代码如下:
import org.springframework.boot.autoconfigure.mongo.MongoCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MongoConfiguration { @Bean public MongoCustomizer mapKeyDotReplacementCustomizer() { return mappingMongoConverter -> mappingMongoConverter.setMapKeyDotReplacement("-DOT"); } }
该方案不需要修改其他Mongo相关配置,添加后直接生效。
方案二:手动定义MongoTemplate绑定自定义转换器
如果你需要完全自定义MappingMongoConverter的所有规则,可以在自定义转换器的同时,手动声明MongoTemplate Bean绑定你的转换器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.DbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @Configuration public class MongoConfiguration { @Bean public MappingMongoConverter mongoConverter(MongoDatabaseFactory mongoFactory, MongoMappingContext mongoMappingContext) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoFactory); MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext); mongoConverter.setMapKeyDotReplacement("-DOT"); // 若有其他自定义转换规则也可在此处添加 return mongoConverter; } @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDatabaseFactory, MappingMongoConverter mongoConverter) { return new MongoTemplate(mongoDatabaseFactory, mongoConverter); } }
注意:该方案需要你自行补全所有原本Spring Boot自动配置的Mongo转换规则,否则可能出现原有类型转换失效的问题。
内容的提问来源于stack exchange,提问作者LeTest
相关产品推荐
相关产品推荐

