在Spring Data Mongo中设置自定义转换器

时间:2015-12-10 22:00:44

标签: java spring mongodb spring-data-mongodb mongodb-java

我们正在尝试为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;
    }
}

这是一个错误还是我们做错了什么?

找到另一项工作: https://stackoverflow.com/a/14369998/4567261

4 个答案:

答案 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()