Spring Data MongoDB + JSR-310またはJava 8の新しいDate API
新しいJava8java.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 Data MongoDB 1.9.2.RELEASE
Spring-dataは新しいJava 8 Date API(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
2. 溶液
上記のJsr310Converters
は、MappingMongoConverter
のSpringマネージドBeanを宣言し、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
です。 これが@Bean
を介してSpringマネージドBeanとして宣言された場合、afterPropertiesSet()
が起動され、Jsr310Converters
を含むすべてのデフォルトコンバーターが登録されます。
3. FAQs
MappingMongoConverter
がSpringによって管理されていない場合(以下のようにnew
キーワードを使用してinit)、.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; } //...