programing

자동 구성을 중단하지 않고 Spring-Boot에서 MappingMongoConverter(setMapKeyDotReplacement)를 사용자 지정하는 방법은 무엇입니까?

muds 2023. 7. 10. 22:59
반응형

자동 구성을 중단하지 않고 Spring-Boot에서 MappingMongoConverter(setMapKeyDotReplacement)를 사용자 지정하는 방법은 무엇입니까?

Spring-Boot-Application(1.3.2) 내에서 를 사용자 지정하려면 어떻게 해야 합니까?RELEASE) 스프링 데이터에 의해 자동으로 구성되는 몽고 스탭을 변경하지 않고도?

현재 솔루션은 다음과 같습니다.

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

이 길로 가는 게 맞나요, 아니면 이걸로 물건을 부수는 건가요?
또는 지도 키닷 대체를 설정하는 더 간단한 방법이 있습니까?

그것이 올바른 방법입니다.자동 구성됨MappingMongoConverter주석이 달렸습니다.@ConditionalOnMissingBean(MongoConverter.class)그래서 자신의 것을 추가하는 것.MappingMongoConverterbean은 자동 구성이 사용자 지정 변환기에 맞게 취소되도록 합니다.

한 가지 사소한 수정 사항: 전화할 필요가 없습니다.mongoConverter.afterPropertiesSet()컨테이너가 당신을 위해 그것을 부를 것입니다.

짧은 버전도 있습니다.

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

Spring이 인식할 수 있도록 클래스에 입력해야 합니다. 예를 들어, 클래스에 주석을 달아야 합니다.@Configuration

최근 버전의 스프링 부트에서 이 문제를 발견했습니다.귀하의 접근 방식이 저에게 효과가 없거나 승인된 답변입니다. 제 부트 앱이 사용자 지정 매핑 변환기를 무시하는 것 같습니다.

구성 클래스에서 수행한 작업은 부팅에 사용되는 MappingMongoConverter에서 자동으로 연결한 다음 setMapKeyDotReplacement를 설정했습니다.

@Autowired
private MappingMongoConverter mongoConverter;

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

우리는 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);
}

언급URL : https://stackoverflow.com/questions/35598595/how-to-customize-mappingmongoconverter-setmapkeydotreplacement-in-spring-boot

반응형