Spring Data MongoDB JSR-310 или Java 8 новые API даты

Spring Data MongoDB + JSR-310 или новые API даты Java 8

При сохранении объекта, содержащего новый Java 8java.time.LocalDateTime, выдается следующая ошибка:

org.springframework.core.convert.ConverterNotFoundException:
    No converter found capable of converting
               from type [java.time.LocalDateTime] to type [java.util.Date]

проверенный

  1. Весна 4.3.2.РЕЛИЗ

  2. Spring Data MongoDB 1.9.2.РЕЛИЗ

Поддерживает ли Spring-data новые API-интерфейсы Java 8 Date (JSR-310)?

1. Spring Data + JSR-310

Да, Spring-data поддерживает спецификацию JSR-310 с настраиваемым преобразователем -Jsr310Converters, просмотрите следующий фрагмент кода:

CustomConversions.java

package org.springframework.data.mongodb.core.convert;

public class CustomConversions {

    /**
     * Creates a new {@link CustomConversions} instance registering the given converters.
     *
     * @param converters
     */
    public CustomConversions(List converters) {

        //...
        List toRegister = new ArrayList();

        // Add user provided converters to make sure they can override the defaults
        toRegister.addAll(converters);
        toRegister.add(CustomToStringConverter.INSTANCE);
        toRegister.addAll(MongoConverters.getConvertersToRegister());
        toRegister.addAll(JodaTimeConverters.getConvertersToRegister());
        toRegister.addAll(GeoConverters.getConvertersToRegister());
        toRegister.addAll(Jsr310Converters.getConvertersToRegister());
        toRegister.addAll(ThreeTenBackPortConverters.getConvertersToRegister());

        for (Object c : toRegister) {
            registerConversion(c);
        }

        //...
    }



2. Решение

ВышеупомянутыйJsr310Converters будет включен, если вы объявили управляемый bean-компонент Spring дляMappingMongoConverter и передали его в качестве аргумента дляMongoTemplate, просмотрите следующий пример MongoConfig:

MongoConfig.java

//...
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;

@Configuration
@ComponentScan(basePackages = {"com.example.db"})
public class MongoConfig {

    //...
    @Autowired
    MongoDbFactory mongoDbFactory;

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter());
        return mongoTemplate;

    }

    @Bean
    public MappingMongoConverter getDefaultMongoConverter() throws Exception {

        MappingMongoConverter converter = new MappingMongoConverter(
                new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());

        return converter;
    }

    //...

}

MappingMongoConverter расширяетAbstractMongoConverter, аAbstractMongoConverter являетсяInitializingBean. Если это объявлено как управляемый компонент Spring через@Bean, будет запущенafterPropertiesSet(), и будут зарегистрированы все преобразователи по умолчанию, включаяJsr310Converters

3. FAQs

ЕслиMappingMongoConverter не управляется Spring (init с ключевым словомnew, как показано ниже), вы должны вызвать.afterPropertiesSet() вручную.

MongoConfig.java

@Configuration
@ComponentScan(basePackages = {"com.example.db"})
public class MongoConfig {

    @Autowired
    MongoDbFactory mongoDbFactory;

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        MappingMongoConverter converter = new MappingMongoConverter(
                new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());

        //CALL THIS MANULLY, so that all the default convertors will be registered!
        converter.afterPropertiesSet();

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);

        return mongoTemplate;

    }

    //...