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