Spring Data MongoDB + JSR-310 ou Java 8 nouvelles API Date

Spring Data MongoDB + JSR-310 ou Java 8 nouvelles API de date

Lors de l'enregistrement d'un objet contenant les nouveaux Java 8java.time.LocalDateTime, l'erreur suivante est générée:

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

Testé

  1. Printemps 4.3.2.RELEASE

  2. Spring Data MongoDB 1.9.2.RELEASE

Spring-data prend-il en charge les nouvelles API de date Java 8 (JSR-310)?

1. Données de printemps + JSR-310

Oui, Spring-data prend en charge la spécification JSR-310, avec un convertisseur personnalisé -Jsr310Converters, consultez l'extrait de code suivant:

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. Solution

LesJsr310Converters ci-dessus seront activés si vous avez déclaré un bean géré par Spring pourMappingMongoConverter, et passez comme argument pourMongoTemplate, consultez l'exemple MongoConfig suivant:

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

    //...

}

LeMappingMongoConverter étendAbstractMongoConverter et leAbstractMongoConverter est unInitializingBean. Si cela est déclaré comme un bean géré par Spring via@Bean, leafterPropertiesSet() sera déclenché et enregistré tous les convertisseurs par défaut, y compris lesJsr310Converters

3. FAQs

Si leMappingMongoConverter n'est pas géré par Spring (init avec un mot-clénew comme ci-dessous), vous devez appeler le.afterPropertiesSet() manuellement.

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;

    }

    //...