web-dev-qa-db-ja.com

自動構成を壊さずにSpring-BootでMappingMongoConverter(setMapKeyDotReplacement)をカスタマイズするにはどうすればよいですか?

Spring-Dataによって自動構成されたmongo-stuffを変更せずに、Spring-Boot-Application(1.3.2.RELEASE)内で MappingMongoConverter をカスタマイズするにはどうすればよいですか?

私の現在の解決策は次のとおりです。

@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を設定するさらに簡単な方法はありますか?

14
Mike Boddin

それが正しい方法です。自動構成されたMappingMongoConverterには@ConditionalOnMissingBean(MongoConverter.class)の注釈が付けられているため、独自のMappingMongoConverter Beanを追加すると、自動構成がバックオフされ、カスタムコンバーターが優先されます。

マイナーな修正が1つあります。mongoConverter.afterPropertiesSet()を呼び出す必要はありません。コンテナがそれを呼び出します。

8
Andy Wilkinson

SpringBootの最新バージョンでこの問題が発生しました。あなたのアプローチは私または受け入れられた答えのために機能しませんでした...私のブートアプリは私のカスタムマッピングコンバーターを無視しているようでした。

したがって、ブートが使用するMappingMongoConverterで自動配線した構成クラスで行ったことを実行し、その上にsetMapKeyDotReplacementを設定しました。

@Autowired
private MappingMongoConverter mongoConverter;

// Converts . into a mongo friendly char
@PostConstruct
public void setUpMongoEscapeCharacterConversion() {
    mongoConverter.setMapKeyDotReplacement("_");
}
8
David Billings

また、より短いバージョンがあります:

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

Springが認識しているクラスに入れることを忘れないでください-例: @Configurationで注釈が付けられたクラス

5
ZZ 5