在 Spring 数据 Mongo 中设置自定义转换器
Setup custom converters in Spring Data Mongo
我们正在尝试为 Spring Data Mongo
设置我们自己的转换器,但遇到了问题。
似乎 Spring 从不在 CustomConversions 上调用 registerConvertersIn
,因此我们通过覆盖 AbstractMongoConfiguration#customConversions
添加的自定义转换器永远不会成为转换的一部分。
我们正在使用 Spring Data Mongo 1.6.3,但它似乎也可能是 1.8.0 的问题(我检查了对 CustomConversions#registerConvertersIn
的调用并发现none.)
我能够通过在自定义 MappingMongoConverter
中调用 CustomConversions#registerConvertersIn
来解决这个问题,如下所示:
class MongoConfig extends AbstractMongoConfiguration {
@Bean
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()) {
@Override
public void setCustomConversions(CustomConversions conversions) {
super.setCustomConversions(conversions);
conversions.registerConvertersIn(conversionService);
}
};
converter.setCustomConversions(customConversions());
return converter;
}
}
这是错误还是我们做错了什么?
找到另一个解决方法:
你用 @Configuration
注释了你的 MongoConfig
class 了吗?
您的 class MongoConfig 需要由 Spring BeanFactory 管理以获得回调 afterPropertiesSet()
(其中 conversions.registerConvertersIn(conversionService)
最初被调用)自动调用
如果您不注释您的配置 bean,您需要自己调用 afterPropertiesSet()
除了这个对我没用。
在设置 mongoTemplate
时,我们需要告诉 mongo 数据库使用自定义转换:
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongo(), mongoDatabase);
MappingMongoConverter conv = (MappingMongoConverter) mongoTemplate.getConverter();
// tell mongodb to use the custom converters
conv.setCustomConversions(customConversions());
conv.afterPropertiesSet();
return mongoTemplate;
}
关注此 link 了解更多详情:
在 Spring 启动 2.x 中,它就像创建一个注册所有转换器的注册 bean 一样简单:
@Configuration
public class Converters {
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(
Arrays.asList(
new MyClassToBytesConverter(),
new BytesToMyClassConverter()));
}
}
然后创建转换器 类:
@WritingConverter
public class MyClassToBytesConverter implements Converter<MyClass, Binary> {
@Override
public Binary convert(MyClasssource) {
// your code
}
}
@ReadingConverter
public class BytesToMyClassConverter implements Converter<Binary, MyClass> {
@Override
public MyClass convert(Binary source) {
/// your code
}
}
我花了一个小时才弄清楚spring数据的最新版本应该使用mongo,而不是org.bson.Document
com.mongodb.BasicDBObject
。这是一个例子:
@Component
@WritingConverter
public class UserModelConverter implements Converter<UserModel, Document> {
@Override
public Document convert(UserModel s) {
Document obj = new Document();
obj.put("firstName", "FirstName");
obj.put("lastName", "LastName");
obj.remove("_class");
return obj;
}
}
我们正在尝试为 Spring Data Mongo
设置我们自己的转换器,但遇到了问题。
似乎 Spring 从不在 CustomConversions 上调用 registerConvertersIn
,因此我们通过覆盖 AbstractMongoConfiguration#customConversions
添加的自定义转换器永远不会成为转换的一部分。
我们正在使用 Spring Data Mongo 1.6.3,但它似乎也可能是 1.8.0 的问题(我检查了对 CustomConversions#registerConvertersIn
的调用并发现none.)
我能够通过在自定义 MappingMongoConverter
中调用 CustomConversions#registerConvertersIn
来解决这个问题,如下所示:
class MongoConfig extends AbstractMongoConfiguration {
@Bean
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()) {
@Override
public void setCustomConversions(CustomConversions conversions) {
super.setCustomConversions(conversions);
conversions.registerConvertersIn(conversionService);
}
};
converter.setCustomConversions(customConversions());
return converter;
}
}
这是错误还是我们做错了什么?
找到另一个解决方法:
你用 @Configuration
注释了你的 MongoConfig
class 了吗?
您的 class MongoConfig 需要由 Spring BeanFactory 管理以获得回调 afterPropertiesSet()
(其中 conversions.registerConvertersIn(conversionService)
最初被调用)自动调用
如果您不注释您的配置 bean,您需要自己调用 afterPropertiesSet()
除了这个对我没用。
在设置 mongoTemplate
时,我们需要告诉 mongo 数据库使用自定义转换:
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongo(), mongoDatabase);
MappingMongoConverter conv = (MappingMongoConverter) mongoTemplate.getConverter();
// tell mongodb to use the custom converters
conv.setCustomConversions(customConversions());
conv.afterPropertiesSet();
return mongoTemplate;
}
关注此 link 了解更多详情:
在 Spring 启动 2.x 中,它就像创建一个注册所有转换器的注册 bean 一样简单:
@Configuration
public class Converters {
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(
Arrays.asList(
new MyClassToBytesConverter(),
new BytesToMyClassConverter()));
}
}
然后创建转换器 类:
@WritingConverter
public class MyClassToBytesConverter implements Converter<MyClass, Binary> {
@Override
public Binary convert(MyClasssource) {
// your code
}
}
@ReadingConverter
public class BytesToMyClassConverter implements Converter<Binary, MyClass> {
@Override
public MyClass convert(Binary source) {
/// your code
}
}
我花了一个小时才弄清楚spring数据的最新版本应该使用mongo,而不是org.bson.Document
com.mongodb.BasicDBObject
。这是一个例子:
@Component
@WritingConverter
public class UserModelConverter implements Converter<UserModel, Document> {
@Override
public Document convert(UserModel s) {
Document obj = new Document();
obj.put("firstName", "FirstName");
obj.put("lastName", "LastName");
obj.remove("_class");
return obj;
}
}