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