2014-04-09 15 views
9

Provo ad utilizzare LocalTime da Java 8 Date Time API con Spring Data MongoDB. Inserimento del documento funziona come previsto, ma quando cerco di leggere il documento, ottengo il seguente errore:Spring Data MongoDB con 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 

Ho provato questo con l'esempio dal sito web di Primavera: http://spring.io/guides/gs/accessing-data-mongodb/ Ho appena cambiato al Cliente di avere una data di nascita:

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); 
    } 

} 

risposta

7

ho scritto questo po 'di codice per tutti e 4 di queste opzioni di conversione:

  • DateToLocalDateTimeConverter
  • DateToLocalDateConverter
  • LocalDateTimeToDateConverter
  • LocalDateToDateConverter

Ecco un esempio

public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { 

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

Poi includendo questo nella configurazione XML per il collegamento MongoDB sono stato in grado di lavorare in Java 8 date con MongoDB (ricordarsi di aggiungere tutti i convertitori):

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

Buono! Ci sarà un'implementazione fuori dal comune per il prossimo [1.7 M1] (https://jira.spring.io/browse/DATAMONGO-1102). –

+1

@OliverGierke Ho provato a utilizzare http://repo.spring.io/libs-milestone/org/springframework/data/spring-data-mongodb/1.7.0.M1/ e ottengo ancora "Nessuna proprietà trovata sull'entità class java.time.LocalDateTime per associare il parametro del costruttore a " –

+0

Sto ancora affrontando questo problema .. Qualche aiuto diverso dalla definizione dei nostri convertitori personalizzati? –

1

Questo è attualmente non supportato principalmente a causa del fatto che MongoDB non supporta la memorizzazione Java tipi di tempo 8 data ora. Suggerisco di trasformare la proprietà interna in una legacy Date e fare le conversioni sull'API della classe di dominio (come faresti con Hibernate e JodaTime, ad es.).

Problemi correlati