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

Kon*_*rov 2 java spring mongodb mongodb-java spring-data-mongodb

我们正在尝试为此设置我们自己的转换器,Spring Data Mongo并遇到了问题。

好像Spring从不要求registerConvertersIn使用CustomConversions,因此通过重写添加的自定义转换器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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

找到了另一种解决方法:https : //stackoverflow.com/a/14369998/4567261

And*_*own 12

在 Spring Boot 2.x 中,它就像创建一个注册所有转换器的注册 bean 一样简单:

@Configuration
public class Converters {

  @Bean
  public MongoCustomConversions mongoCustomConversions() {

    return new MongoCustomConversions(
        Arrays.asList(
            new MyClassToBytesConverter(),
            new BytesToMyClassConverter()));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后创建您的转换器类:

@WritingConverter
public class MyClassToBytesConverter implements Converter<MyClass, Binary> {

  @Override
  public Binary convert(MyClasssource) {
  // your code
  }
}
Run Code Online (Sandbox Code Playgroud)
@ReadingConverter
public class BytesToMyClassConverter implements Converter<Binary, MyClass> {

  @Override
  public MyClass convert(Binary source) {
  /// your code
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 有 5 种不同的转换器类(bson、jackson-databing、spring-core 等),您能否提及您在转换器类中使用了哪一种? (2认同)

iam*_*der 7

我花了一个小时才弄明白在最新版本的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了一个多小时才找到你的帖子。谢谢你。我不明白为什么这没有更广泛地发布,也不明白为什么 BasicDBObject 不向后兼容已弃用的警告。升级体验极差。 (3认同)

小智 5

但这对我没有任何帮助。在设置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;

}
Run Code Online (Sandbox Code Playgroud)

单击此链接以获取更多详细信息:http : //ufasoli.blogspot.in/2017/06/custom-converter-for-mongodb-and-spring.html


Gut*_*Gut 3

你用 注释你的MongoConfig类吗@Configuration

您的类 MongoConfig 需要由 Spring BeanFactory 管理才能自动调用回调afterPropertiesSet()conversions.registerConvertersIn(conversionService)最初调用的位置)

如果你没有注释你的配置bean,你需要调用afterPropertiesSet()自己