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
-
Frühling 4.3.2.FREIGABE
-
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
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;
}
//...