[SPRING] Java 8 LocalDate MappingException을 사용하는 Spring 데이터 MongoDB
SPRINGJava 8 LocalDate MappingException을 사용하는 Spring 데이터 MongoDB
Spring Data MongoDB에서 Java 8 Date Time API의 LocalTime을 사용하려고합니다. 문서를 삽입하면 예상대로 작동하지만 문서를 읽으려고하면 다음 오류가 발생합니다.
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
나는 Spring 웹 사이트의 예제를 가지고 이것을 시도했다 : http://spring.io/guides/gs/accessing-data-mongodb/ 방금 생년월일을 갖기 위해 고객에게 변경했습니다.
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);
}
}
해결법
-
==============================
1.나는이 4 가지 변환 옵션 모두에 대해이 약간의 코드를 작성했습니다.
나는이 4 가지 변환 옵션 모두에 대해이 약간의 코드를 작성했습니다.
여기에 예제가있다.
public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { @Override public LocalDateTime convert(Date source) { return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault()); } }
여기 모든 예제.
그럼 mongodb 연결을위한 XML 구성에 이것을 포함하여 mongodb (모든 변환기를 추가하는 것을 잊지 마십시오)로 java 8 날짜에서 작업 할 수있었습니다 :
<mongo:mapping-converter> <mongo:custom-converters> <mongo:converter> <bean class="package.DateToLocalDateTimeConverter" /> </mongo:converter> </mongo:custom-converters> </mongo:mapping-converter>
-
==============================
2.이제 문제가 해결되었습니다. https://jira.spring.io/browse/DATAMONGO-1102
이제 문제가 해결되었습니다. https://jira.spring.io/browse/DATAMONGO-1102
그러나 Spring Data는 현재 ZonedDateTime을 지원하지 않으며 Local 만 지원합니다.
-
==============================
3.이것은 현재 MongoDB가 Java 8 날짜 유형 저장을 지원하지 않기 때문에 주로 지원되지 않습니다. 내부 속성을 레거시 Date로 변환하고 (예 : 최대 절전 모드 및 JodaTime을 사용하는 것처럼) 도메인 클래스의 API에 대한 변환을 수행하는 것이 좋습니다.
이것은 현재 MongoDB가 Java 8 날짜 유형 저장을 지원하지 않기 때문에 주로 지원되지 않습니다. 내부 속성을 레거시 Date로 변환하고 (예 : 최대 절전 모드 및 JodaTime을 사용하는 것처럼) 도메인 클래스의 API에 대한 변환을 수행하는 것이 좋습니다.
from https://stackoverflow.com/questions/22972679/spring-data-mongodb-with-java-8-localdate-mappingexception by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 PasswordEncoder 오류 (0) | 2019.01.06 |
---|---|
[SPRING] 스프링 보안은 "? 매개 변수"형식과 일치 할 수 없습니까? (0) | 2019.01.06 |
[SPRING] Spring에서 정적 메서드를 가로 채기하는 방법? (0) | 2019.01.06 |
[SPRING] Java Config (no xml)에 SaltSource 등록하는 방법 (0) | 2019.01.06 |
[SPRING] 봄 보안에서 현재 로그인 한 사용자 객체를 얻는 방법? (0) | 2019.01.06 |