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é
-
Printemps 4.3.2.RELEASE
-
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
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; } //...