2014-04-09 8 views
9

Ich versuche, die Localtime von Java 8 Datum Zeit API mit Spring Data MongoDB zu verwenden. Einlegen des Dokuments wie erwartet funktioniert, aber wenn ich versuche, das Dokument zu lesen, bekomme ich folgende Fehlermeldung:Spring Data MongoDB mit Java 8 LOCALDATE MappingException

Exception in thread "main" java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:637) 
    .... 
Caused by: org.springframework.data.mapping.model.MappingException: No property null found on entity class java.time.LocalDate to bind constructor parameter to! 
    at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:74) 
    at org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:63) 
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:71) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:257) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:237) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1109) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$100(MappingMongoConverter.java:78) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1058) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:789) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:270) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:263) 
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:261) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:263) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:237) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:201) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:197) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:78) 
    at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2005) 
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1699) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1522) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1506) 
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:532) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:217) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:174) 
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:44) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:358) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:343) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy28.findAll(Unknown Source) 
    at hello.Application.run(Application.java:36) 
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:634) 
    ... 5 more 

Ich habe versucht, dies mit dem Beispiel aus der Frühlings-Website: http://spring.io/guides/gs/accessing-data-mongodb/ Ich habe gerade an den Kunden ein haben Geburtsdatum:

package hello; 

import org.springframework.data.annotation.Id; 
import java.time.LocalDate; 

public class Customer { 

    @Id 
    private String id; 

    private String firstName; 
    private String lastName; 
    private LocalDate birthDay; 

    public Customer() {} 

    public Customer(String firstName, String lastName, LocalDate birthDay) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.birthDay = birthDay; 
    } 

    @Override 
    public String toString() { 
     return String.format(
       "Customer[id=%s, firstName='%s', lastName='%s']", 
       id, firstName, lastName); 
    } 

} 

Antwort

7

Ich schrieb dieses kleine Stück Code für alle 4 dieser Konvertierungsoptionen:

  • DateToLocalDateTimeConverter
  • DateToLocalDateConverter
  • LocalDateTimeToDateConverter
  • LocalDateToDateConverter

Hier ist ein Beispiel

public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { 

    @Override 
    public LocalDateTime convert(Date source) { 
     return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault()); 
    } 
} 

dann durch das in der XML-Konfiguration für die mongodb Verbindung einschließlich ich in der Lage war, in Java 8 Termine mit mongodb zu arbeiten (Sie erinnern sich alle Wandler hinzugefügt werden):

<mongo:mapping-converter> 
    <mongo:custom-converters> 
     <mongo:converter> 
      <bean class="package.DateToLocalDateTimeConverter" /> 
     </mongo:converter> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 
+0

Gute Eins! Dazu wird es in der kommenden [1.7 M1] (https://jira.spring.io/browse/DATAMONGO-1102) eine Out-of-the-Box-Implementierung geben. –

+1

@OliverGierke Ich versuchte http://repo.spring.io/libs-milestone/org/springframework/data/spring-data-mongodb/1.7.0.M1/ zu verwenden, und ich immer noch bekommen „Nein Eigenschaft null auf Entität gefunden Klasse java.time.LocalDateTime, um den Konstruktorparameter an " –

+0

" zu binden Ich stehe immer noch vor diesem Problem .. Gibt es Hilfe, außer dass wir unsere eigenen benutzerdefinierten Konverter definieren? –

1

Dies ist zurzeit nicht vor allem aufgrund der Tatsache unterstützt, dass MongoDB nicht Java 8 Datum Zeit-Typen jetzt Speicherung unterstützt. Ich schlage vor, die interne Eigenschaft zu einem Legacy Date one zu machen und die Konvertierungen auf der API der Domain-Klasse (wie Sie mit Hibernate und JodaTime tun würden).

Verwandte Themen