我们正在尝试为Spring Data Mongo
设置我们自己的转换器并遇到问题。
看起来像Spring从不在CustomConversions上调用registerConvertersIn
,因此通过覆盖AbstractMongoConfiguration#customConversions
添加的自定义转换器永远不会成为转换的一部分。
我们正在使用Spring Data Mongo 1.6.3,但似乎它也可能是1.8.0的问题(我已经检查了CustomConversions#registerConvertersIn
的调用但没找到。)
我可以通过调用自定义CustomConversions#registerConvertersIn
中的MappingMongoConverter
来解决此问题:
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;
}
}
这是一个错误还是我们做错了什么?
答案 0 :(得分:8)
在Spring Boot 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
}
}
答案 1 :(得分:3)
对我来说没什么用,但是这个。在设置mongo模板时我们需要告诉mongo db使用自定义转换。
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongo(), mongoDatabase);
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setCustomConversions(customConversions()); // tell mongodb to use the custom converters
mongoMapping.afterPropertiesSet();
return mongoTemplate;
}
请点击此链接了解详情:http://ufasoli.blogspot.in/2017/06/custom-converter-for-mongodb-and-spring.html
答案 2 :(得分:3)
我花了一个小时才弄清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;
}
}
答案 3 :(得分:2)
您是否使用MongoConfig
为@Configuration
课程添加了注释?
您的类MongoConfig需要由Spring BeanFactory管理才能获得回调afterPropertiesSet()
(最初调用conversions.registerConvertersIn(conversionService)
)自动调用
如果您没有注释配置bean,则需要自己致电afterPropertiesSet()