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

woobm2wo  于 2023-06-21  发布在  Spring
关注(0)|答案(4)|浏览(229)

我们正在尝试为Spring Data Mongo设置自己的转换器,但遇到了问题。
看起来Spring从来没有在CustomConversions上调用registerConvertersIn,因此我们通过overriden 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://stackoverflow.com/a/14369998/4567261

5lhxktic

5lhxktic1#

在Sping 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
  }
}
oxf4rvwz

oxf4rvwz2#

除了这个我什么都不管用。
在设置mongoTemplate时,我们需要告诉mongo db使用自定义转换:

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

点击此链接了解更多详情:

htrmnn0y

htrmnn0y3#

我花了一个小时才弄清楚在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;
    }
}
cdmah0mi

cdmah0mi4#

你是否用@Configuration注解了你的MongoConfig类?
您的类MongoConfig需要由Spring BeanFactory管理,以自动调用回调afterPropertiesSet()(最初调用conversions.registerConvertersIn(conversionService)
如果您没有注解配置bean,则需要自己调用afterPropertiesSet()

相关问题