Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在Spring Boot中自定义MappingMongoConverter(setMapKeyDotReplacement),而不中断自动配置?_Spring Boot_Spring Data_Spring Data Mongodb - Fatal编程技术网

Spring boot 如何在Spring Boot中自定义MappingMongoConverter(setMapKeyDotReplacement),而不中断自动配置?

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

我如何在我的Spring启动应用程序(1.3.2.RELEASE)中定制mongo,而不更改Spring数据自动配置的mongo内容

我目前的解决办法是:

@配置
公共类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