Преобразователи Spring Mongo не зарегистрированы - PullRequest
0 голосов
/ 24 мая 2018

Я зарегистрировал набор Mongo преобразователей (включая Jsr310Converters), но он не преобразует LocalDate в Date (поскольку canConvertFromLocalDateToDate равно false)

@Configuration
public class MongoConfig {

@Autowired
MongoDbFactory mongoDbFactory;

@Bean
public MongoTemplate mongoTemplate() throws Exception {

    MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory),
            new MongoMappingContext());
    converter.setMapKeyDotReplacement("_");

    List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
    converters.add(new GeoPointConverter());

    converters.addAll(Jsr310Converters.getConvertersToRegister());
    converters.addAll(JodaTimeConverters.getConvertersToRegister());
    converters.addAll(ThreeTenBackPortConverters.getConvertersToRegister());

    converter.setCustomConversions(new CustomConversions(CustomConversions.StoreConversions.NONE, converters));

   //is FALSE !
    boolean canConvertFromLocalDateToDate = converter.getConversionService().canConvert(LocalDate.class, Date.class); 

    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);

    return mongoTemplate;

}

Когда я пытаюсь сохранить некоторые сущности с полями LocalDate, я получаю исключение:

org.springframework.core.convert.ConverterNotFoundException: не найден конвертер, способный к конвертации из типа [java.time.LocalDate] для ввода [java.util.Date]

1 Ответ

0 голосов
/ 31 мая 2018

На самом деле я обнаружил, что у меня было 2 экземпляра MappingMongoConverter во время выполнения.Поэтому я просто повторно использовал экземпляр, созданный Spring, вместо создания нового: @Autowired MappingMongoConverter converter;

Полный фрагмент кода:

@Configuration
public class MongoConfig {


@Autowired 
MappingMongoConverter converter;

@Bean
public MongoTemplate mongoTemplate() throws Exception {
  // NO NEED TO INSTANTIATE NEW MappingMongoConverter 
  //MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());

  converter.setMapKeyDotReplacement("_");

  List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
  converters.add(new GeoPointConverter());

  converters.addAll(Jsr310Converters.getConvertersToRegister());
  converters.addAll(JodaTimeConverters.getConvertersToRegister());
  converters.addAll(ThreeTenBackPortConverters.getConvertersToRegister());

  converter.setCustomConversions(new CustomConversions(CustomConversions.StoreConversions.NONE, converters));
  //is FALSE !
  boolean canConvertFromLocalDateToDate = converter.getConversionService().canConvert(LocalDate.class, Date.class); 
  converter.afterPropertiesSet();
  MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);

  return mongoTemplate;

}
...