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