【问题标题】:Setup custom converters in Spring Data Mongo在 Spring Data Mongo 中设置自定义转换器
【发布时间】:2016-03-16 17:13:07
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

您是否使用 @Configuration 注释了您的 MongoConfig 类?

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

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

【讨论】:

    【解决方案2】:

    除了这个,没有什么对我有用。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我花了一个小时在spring data mongo的LATEST VERSION中弄清楚,应该使用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;
            }
        }
        

        【讨论】:

        • 我花了一个多小时才找到您的帖子。谢谢你。我不明白为什么没有更广泛地发布它,以及为什么 BasicDBObject 不能向后兼容已弃用的警告。升级体验很差。
        • 同意。在找到这个答案之前浪费了很多时间,我找到的每个指南都使用 BasicDBObject。
        猜你喜欢
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        相关资源
        最近更新 更多