新しいJava 8 `java.time.LocalDateTime`を含むオブジェクトを保存しているときに、次のエラーがスローされます。

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

テスト済み

.  Spring 4.3.2.RELEASE

.  SpringデータMongoDB 1.9.2.RELEASE

Spring-dataは新しいJava 8 Date API(JSR-310)をサポートしていますか?

===  1. Springデータ+ JSR-310

はい、Springのデータは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<Object> toRegister = new ArrayList<Object>();

//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`は` MappingMongoConverter`のSpringマネージドBeanを宣言し、 `MongoTemplate`の引数として渡す場合に有効になります。次のMongoConfigの例を見直してください:

MongoConfig.java

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

@Configuration
@ComponentScan(basePackages = {"com.mkyong.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`です。これが

@ Bean`を介してSpring管理Beanとして宣言された場合、

afterPropertiesSet()

が起動され、

Jsr310Converters`を含むすべてのデフォルトコンバータが登録されます。

3.よくある質問


MappingMongoConverter`がSpring(以下のような

new`キーワードを持つinit)によって管理されていない場合、 `.afterPropertiesSet()`を手動で呼び出さなければなりません。

MongoConfig.java

@Configuration
@ComponentScan(basePackages = {"com.mkyong.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;

    }

   //...