2014-04-09 15 views
9

Tôi cố gắng sử dụng LocalTime từ Java 8 Date Time API với dữ liệu Spring MongoDB. Chèn các tài liệu hoạt động như mong đợi, nhưng khi tôi cố gắng để đọc các tài liệu, tôi nhận được lỗi sau:Dữ liệu Spring MongoDB với 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 

Tôi cố gắng này với ví dụ từ trang web của mùa xuân: http://spring.io/guides/gs/accessing-data-mongodb/ tôi chỉ cần thay đổi để khách hàng có một ngày sinh:

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

} 

Trả lời

7

tôi đã viết điều này ít mã cho tất cả 4 các tùy chọn chuyển đổi:

  • DateToLocalDateTimeConverter
  • DateToLocalDateConverter
  • LocalDateTimeToDateConverter
  • LocalDateToDateConverter

Dưới đây là một ví dụ

public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { 

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

Sau đó, bằng cách bao gồm này trong cấu hình xml cho kết nối MongoDB tôi đã có thể làm việc trong java 8 ngày với MongoDB (nhớ để thêm tất cả các bộ chuyển đổi):

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

Tốt nhất! Sẽ có một triển khai thực hiện ngoài hộp cho điều đó trong [1,7 M1] sắp tới (https://jira.spring.io/browse/DATAMONGO-1102). –

+1

@OliverGierke Tôi đã cố gắng sử dụng http://repo.spring.io/libs-milestone/org/springframework/data/spring-data-mongodb/1.7.0.M1/ và tôi vẫn nhận được "Không tìm thấy thuộc tính null nào trên thực thể class java.time.LocalDateTime để ràng buộc tham số constructor thành " –

+0

Tôi vẫn đang gặp vấn đề này .. Bất kỳ trợ giúp nào khác ngoài việc định nghĩa các trình biến đổi tùy chỉnh của riêng chúng ta? –

1

Điều này hiện không được hỗ trợ chủ yếu do MongoDB không hỗ trợ lưu trữ loại thời gian ngày Java 8. Tôi đề nghị biến thuộc tính nội bộ thành một thừa kế Date và thực hiện chuyển đổi trên API của lớp miền (như bạn sẽ làm với Hibernate và JodaTime, ví dụ:).

Các vấn đề liên quan