Spring boot 如何在Spring Boot中自定义MappingMongoConverter(setMapKeyDotReplacement),而不中断自动配置?
我如何在我的Spring启动应用程序(1.3.2.RELEASE)中定制mongo,而不更改Spring数据自动配置的mongo内容 我目前的解决办法是:Spring boot 如何在Spring Boot中自定义MappingMongoConverter(setMapKeyDotReplacement),而不中断自动配置?,spring-boot,spring-data,spring-data-mongodb,Spring Boot,Spring Data,Spring Data Mongodb,我如何在我的Spring启动应用程序(1.3.2.RELEASE)中定制mongo,而不更改Spring数据自动配置的mongo内容 我目前的解决办法是: @配置 公共类MongoConfig{ @自动连线 私营MongoDbFactory mongoFactory; @自动连线 私有MongoMappingContext MongoMappingContext; @豆子 公共映射mongoConverter mongoConverter()引发异常{ DbRefResolver DbRefRe
@配置
公共类MongoConfig{
@自动连线
私营MongoDbFactory mongoFactory;
@自动连线
私有MongoMappingContext MongoMappingContext;
@豆子
公共映射mongoConverter mongoConverter()引发异常{
DbRefResolver DbRefResolver=新的默认DbRefResolver(mongoFactory);
MappingMongoConverter mongoConverter=新的MappingMongoConverter(dbRefResolver,mongoMappingContext);
//这是我的定制
mongoConverter.setMapKeyDotReplacement(“”);
mongoConverter.AfterPropertieSet();
返回mongoConverter;
}
}
这是正确的方法还是我用它打破了一些东西?或者是否有更简单的方法来设置mapKeyDotReplacement?这是正确的方法。自动配置的
MappingMongoConverter
用@ConditionalOnMissingBean(MongoConverter.class)
注释,因此添加自己的MappingMongoConverter
bean将导致自动配置退出,以支持自定义转换器
一个小更正:您无需调用
mongoConverter.afterPropertiesSet()
。容器将为您调用它。我在最新版本的spring boot中遇到了这个问题。你的方法不适用于我或接受的答案…我的启动应用程序似乎忽略了我的自定义映射转换器
因此,我在配置类中所做的是在boot使用的MappingMongoConverter中自动连接,然后在此基础上设置setMapKeyDotReplacement
@Autowired
private MappingMongoConverter mongoConverter;
// Converts . into a mongo friendly char
@PostConstruct
public void setUpMongoEscapeCharacterConversion() {
mongoConverter.setMapKeyDotReplacement("_");
}
还有一个较短的版本:
@Autowired
void setMapKeyDotReplacement(MappingMongoConverter mappingMongoConverter) {
mappingMongoConverter.setMapKeyDotReplacement("_");
}
请记住将其放入Spring将知道的类中-例如,使用
@配置注释的类
我们可以在Mongo模板中使用默认映射转换器,并更改我们需要的内容
/**
* <p>
* Gets default mapping converted that can be overiden based on the need.
* This is the default mapping used inside mongo template when no custom converter is passed
* </p>
* @param factory
* @return
*/
private static MongoConverter getDefaultMongoConverter(MongoDbFactory factory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList());
MongoMappingContext mappingContext = new MongoMappingContext();
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
mappingContext.afterPropertiesSet();
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext);
converter.setCustomConversions(conversions);
converter.setCodecRegistryProvider(factory);
converter.afterPropertiesSet();
return converter;
}
@Bean
@Primary
public MongoTemplate mongoTemplate() {
MappingMongoConverter mappingMongoConverter = (MappingMongoConverter) getDefaultMongoConverter(mongoDbFactory());
// custom key to map dot (.) with "__mongo_key__" when saving and replacing it with dot (.) again when it
// is retrieved
mappingMongoConverter.setMapKeyDotReplacement("__mongo_key__");
return new MongoTemplate(mongoDbFactory(), mappingMongoConverter);
}
/**
*
*获取可根据需要转换的默认映射。
*这是在没有传递自定义转换器时在mongo模板中使用的默认映射
*
*@param工厂
*@返回
*/
专用静态MongoConverter getDefaultMongoConverter(MongoDbFactory工厂){
DbRefResolver DbRefResolver=新的默认DbRefResolver(工厂);
MongoCustomConversions conversions=新的MongoCustomConversions(Collections.emptyList());
MongoMappingContext mappingContext=新建MongoMappingContext();
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
mappingContext.AfterPropertieSet();
MappingMongoConverter converter=新的MappingMongoConverter(dbRefResolver,mappingContext);
converter.setCustomConversions(转换);
converter.SetCodeRegistryProvider(工厂);
转换器。AfterPropertieSet();
回流转换器;
}
@豆子
@初级的
公共MongoTemplate MongoTemplate(){
MappingMongoConverter MappingMongoConverter=(MappingMongoConverter)getDefaultMongoConverter(mongoDbFactory());
//保存时用“_mongo_key__”映射点(.)的自定义键,保存时用点(.)替换
//取回
mappingMongoConverter.setMapKeyDotReplacement(“\uuu mongo\u key\uuuu”);
返回新的MongoTemplate(mongoDbFactory(),mappingMongoConverter);
}
不需要进行空检查,因为您没有将依赖项(mongoConverter
)指定为可选项。在将方法重新命名为mappingMongoConverter
后,for me解决方案开始工作,因为我正在扩展AbstractMongoConfiguration
,谢谢,它成功了。需要研究MappingMongoConverter