代码之家  ›  专栏  ›  技术社区  ›  Mike Boddin

如何在Spring Boot中自定义MappingMongoConverter(setMapKeyDotReplacement)而不破坏自动配置?

  •  17
  • Mike Boddin  · 技术社区  · 10 年前

    我如何定制 MappingMongoConverter 在我的Spring Boot应用程序(1.3.2.RELEASE)中,而不更改任何由Spring数据自动配置的mongo内容?

    我目前的解决方案是:

    @Configuration
    public class MongoConfig {
    
      @Autowired
      private MongoDbFactory mongoFactory;
    
      @Autowired
      private MongoMappingContext mongoMappingContext;
    
      @Bean
      public MappingMongoConverter mongoConverter() throws Exception {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoFactory);
        MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        //this is my customization
        mongoConverter.setMapKeyDotReplacement("_");
        mongoConverter.afterPropertiesSet();
        return mongoConverter;
      }
    }
    

    这是正确的方法,还是我用这个打破一些东西?
    还是有更简单的方法来设置mapKeyDotReplacement?

    4 回复  |  直到 10 年前
        1
  •  11
  •   Andy Wilkinson    10 年前

    这是正确的做法。自动配置的 MappingMongoConverter 注释为 @ConditionalOnMissingBean(MongoConverter.class) ,所以添加您自己的 映射MongoConverter bean将导致自动配置退出,转而支持您的自定义转换器。

    一个小更正:你不需要打电话 mongoConverter.afterPropertiesSet() 。集装箱会为你打电话。

        2
  •  9
  •   David Billings    8 年前

    我在最新版本的spring boot中遇到过这个问题。你的方法对我或公认的答案都不起作用…我的引导应用程序似乎忽略了我的自定义映射转换器。

    因此,我在配置类中所做的是在引导使用的MappingMongoConverter中自动连接,然后在上面设置setMapKeyDotReplacement。

    @Autowired
    private MappingMongoConverter mongoConverter;
    
    // Converts . into a mongo friendly char
    @PostConstruct
    public void setUpMongoEscapeCharacterConversion() {
        mongoConverter.setMapKeyDotReplacement("_");
    }
    
        3
  •  8
  •   ZZ 5    8 年前

    还有更短的版本:

    @Autowired
    void setMapKeyDotReplacement(MappingMongoConverter mappingMongoConverter) {
        mappingMongoConverter.setMapKeyDotReplacement("_");
    }
    

    请记住将它放入Spring将知道的类中-例如,用 @Configuration

        4
  •  0
  •   Mukundhan    5 年前

    我们可以使用 默认映射转换器 Mongo模板 改变我们需要的

    /**
     * <p>
     * Gets default mapping converted that can be overiden based on the need.
     * This is the default mapping used inside mongo template when no custom converter is passed
     * </p>
     * @param factory
     * @return
     */
    private static MongoConverter getDefaultMongoConverter(MongoDbFactory factory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList());
        MongoMappingContext mappingContext = new MongoMappingContext();
        mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
        mappingContext.afterPropertiesSet();
        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext);
        converter.setCustomConversions(conversions);
        converter.setCodecRegistryProvider(factory);
        converter.afterPropertiesSet();
        return converter;
    }
    
    
    @Bean
    @Primary
    public MongoTemplate mongoTemplate() {
        MappingMongoConverter mappingMongoConverter = (MappingMongoConverter) getDefaultMongoConverter(mongoDbFactory());
        // custom key to map dot (.) with "__mongo_key__" when saving and replacing it with dot (.) again when it 
        // is retrieved
        mappingMongoConverter.setMapKeyDotReplacement("__mongo_key__");
        return new MongoTemplate(mongoDbFactory(), mappingMongoConverter);
    }