Как настроить MappingMongoConverter (setMapKeyDotReplacement) в Spring-Boot, не нарушая автоконфигурацию?

Как мне настроить MappingMongoConverter в моем Spring-Boot-Application (1.3.2.RELEASE) без изменения какого-либо монго-материала, который автоматически настраивается Spring-данными?

Мое текущее решение:

@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?


person Mike Boddin    schedule 24.02.2016    source источник


Ответы (4)


Это правильный способ сделать это. Автоматически настроенный MappingMongoConverter аннотируется @ConditionalOnMissingBean(MongoConverter.class), поэтому добавление собственного компонента MappingMongoConverter приведет к тому, что автоматическая настройка будет отменена в пользу вашего пользовательского конвертера.

Одно небольшое уточнение: вам не нужно звонить mongoConverter.afterPropertiesSet(). Контейнер вызовет это для вас.

person Andy Wilkinson    schedule 24.02.2016

Я столкнулся с этой проблемой в последней версии весенней загрузки. Ваш подход не сработал для меня или принятого ответа ... мое загрузочное приложение, казалось, игнорировало мой пользовательский конвертер карт.

Итак, что я сделал в классе конфигурации, который я автоматически подключил в MappingMongoConverter, который использует загрузка, а затем установил для него setMapKeyDotReplacement.

@Autowired
private MappingMongoConverter mongoConverter;

// Converts . into a mongo friendly char
@PostConstruct
public void setUpMongoEscapeCharacterConversion() {
    mongoConverter.setMapKeyDotReplacement("_");
}
person David Billings    schedule 03.10.2016
comment
Нет необходимости в нулевой проверке, поскольку вы не указали зависимость (mongoConverter) как необязательную. - person LoganMzz; 26.09.2017
comment
Для меня решение начало работать после переименования метода в mappingMongoConverter, потому что я расширяю AbstractMongoConfiguration - person heroin; 17.05.2018

Также есть более короткая версия:

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

Не забудьте поместить его в класс, о котором Spring будет знать, например. класс с аннотацией @Configuration

person ZZ 5    schedule 06.06.2018
comment
Спасибо, это сработало. нужно изучить MappingMongoConverter - person Lakshman Miani; 21.03.2019

Мы можем использовать преобразователь сопоставления по умолчанию внутри шаблона 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);
}
person Mukundhan    schedule 01.07.2020