springboot-data-mongodb 使用autoconfiguration如何添加自定义Converter
在使用spirng-data-mongodb的自动配置时,默认会启用mappingMongoConverter,其中附带了许多类型转换器,供向数据库中插入或读取数据时做类型转换。读取数据时首先会从mongodb中读取数据并构造为java中的对应的类型,随后再将其转换为实体对象,mappingMongoConverter就是提供这项功能的。当mappingMongoConverter遇到无法转换的类型时就会抛出异常,这时候就需要添加自定义Converter。
比如这里,将Date对象转换为Timestamp,由于mappingMongoConverter缺少两者的转换器。
我们可以通过继承AbstractMongoConverter来自定义MongoConverter从而实现自定义类型转换,但在这里只需要给MongoConverter添加一个类型转换器
在类MongoDatabaseFactoryDependentConfiguration.class中给ioc容器中注入了mappingMongoConverter,我们可以看到mappingMongoConverter方法有参数MongoCustomConversions,MongoCustomConversions就是用来管理自定义Converter的,我们只要给ioc容器中添加一个MongoCustomConversions对象就行了。
// 文件 MongoDatabaseFactoryDependentConfiguration.class
@Bean
@ConditionalOnMissingBean(MongoConverter.class)
MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context,
MongoCustomConversions conversions) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
mappingConverter.setCustomConversions(conversions);
return mappingConverter;
}
需要注意的是MongoCustomConversions的构造方法需要一个List,使用Arrays.asList来生成。通过自定义MongoCustomConversions给MongoConverter添加了<Date, Timestamp>的类型转换器,再次运行错误消失。
@Bean
public MongoCustomConversions mongoCustomConversions(){
return new MongoCustomConversions(Arrays.asList(new Converter<Date, Timestamp>() {
@Override
public Timestamp convert(Date source) {
return new Timestamp(source.getTime());
}
}));
}
在Spring Boot使用spring-data-mongodb时,若遇到默认转换器无法处理的类型(如Date到Timestamp),可通过自定义Converter解决。本文介绍了如何在自动配置中添加自定义Converter,以避免mappingMongoConverter抛出异常。通过创建并注入Converter,将转换器添加到mappingMongoConverter中,可以成功处理特定类型的转换问题。
2880

被折叠的 条评论
为什么被折叠?



