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

17

我们试图为Spring Data Mongo设置自己的转换器,但遇到了问题。

似乎Spring从不调用CustomConversions上的registerConvertersIn,因此通过重写AbstractMongoConfiguration#customConversions添加的自定义转换器永远不会成为转换的一部分。

我们正在使用Spring Data Mongo 1.6.3,但似乎这也可能是1.8.0的问题(我检查了对CustomConversions#registerConvertersIn的调用,却没有发现任何东西。)

我能够通过在自定义的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;
    }
}

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

找到了另一种解决方法: https://dev59.com/FmYr5IYBdhLWcg3wTYm4#14369998


似乎更好的方法是在MappingMongoConverter上调用afterPropertiesSet。https://dev59.com/FmYr5IYBdhLWcg3wTYm4 仍然不清楚为什么Spring Data Mongo本身不能自动完成此操作。 - Konstantin Fedorov
4个回答

28
在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
  }
}

2
你好,有5个不同的转换器类(bson、jackson-databing、spring-core等),请问您在您的转换器类中使用了哪一个? - user11908262

13

除此之外,对我来说什么都没用。

在设置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;
}

点击以下链接获取更多详情:


11
在最新版的Spring Data 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;
    }
}

5
我花了一个多小时才找到你的帖子。非常感谢。我不明白为什么这个问题没有被更广泛地发布,以及为什么BasicDBObject不具备向后兼容性和弃用警告。升级体验很差。 - ystan-
同意。在找到这个答案之前,我浪费了很多时间,我找到的每个指南都使用BasicDBObject。 - caprica
我现在非常爱你!在找到你的解决方案之前,浪费了几个小时的无意义尝试。令人恼火的是,spring-data.mongodb文档实际上使用String而不是Document!?:mindblown: - RekaB

3

你是否在MongoConfig类上注释了@Configuration

你的MongoConfig类需要由Spring BeanFactory管理,以便自动调用回调afterPropertiesSet()(原始调用conversions.registerConvertersIn(conversionService)

如果你没有为配置bean添加注释,则需要手动调用afterPropertiesSet()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接