Spring Data MongoDB + JSR-310 oder Java 8 neue Datums-APIs

Spring Data MongoDB + JSR-310 oder Java 8 neue Datums-APIs

Beim Speichern eines Objekts mit den neuen Java 8java.time.LocalDateTime wird der folgende Fehler ausgegeben:

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

Geprüft

  1. Frühling 4.3.2.FREIGABE

  2. Spring Data MongoDB 1.9.2.RELEASE

Unterstützt Spring-data die neuen Java 8 Date APIs (JSR-310)?

1. Federdaten + JSR-310

Ja, Spring-data unterstützt die JSR-310-Spezifikation mit einem benutzerdefinierten Konverter -Jsr310Converters. Überprüfen Sie das folgende Codefragment:

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. Lösung

Die obigenJsr310Converters werden aktiviert, wenn Sie eine von Spring verwaltete Bean fürMappingMongoConverter deklariert und als Argument fürMongoTemplate übergeben haben. Überprüfen Sie das folgende MongoConfig-Beispiel:

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

    //...

}

DasMappingMongoConverter erweitertAbstractMongoConverter und dasAbstractMongoConverter ist einInitializingBean. Wenn dies über@Bean als Spring-verwaltete Bean deklariert wird, werden dieafterPropertiesSet() ausgelöst und alle Standardkonverter registriert, einschließlich derJsr310Converters

3. FAQs

WennMappingMongoConverter nicht von Spring verwaltet wird (init mit einem Schlüsselwortnew wie unten), müssen Sie.afterPropertiesSet() manuell aufrufen.

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;

    }

    //...