복붙노트

[SPRING] Java 8 LocalDate MappingException을 사용하는 Spring 데이터 MongoDB

SPRING

Java 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. ==============================

    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. ==============================

    2.이제 문제가 해결되었습니다. https://jira.spring.io/browse/DATAMONGO-1102

    이제 문제가 해결되었습니다. https://jira.spring.io/browse/DATAMONGO-1102

    그러나 Spring Data는 현재 ZonedDateTime을 지원하지 않으며 Local 만 지원합니다.

  3. ==============================

    3.이것은 현재 MongoDB가 Java 8 날짜 유형 저장을 지원하지 않기 때문에 주로 지원되지 않습니다. 내부 속성을 레거시 Date로 변환하고 (예 : 최대 절전 모드 및 JodaTime을 사용하는 것처럼) 도메인 클래스의 API에 대한 변환을 수행하는 것이 좋습니다.

    이것은 현재 MongoDB가 Java 8 날짜 유형 저장을 지원하지 않기 때문에 주로 지원되지 않습니다. 내부 속성을 레거시 Date로 변환하고 (예 : 최대 절전 모드 및 JodaTime을 사용하는 것처럼) 도메인 클래스의 API에 대한 변환을 수행하는 것이 좋습니다.

  4. from https://stackoverflow.com/questions/22972679/spring-data-mongodb-with-java-8-localdate-mappingexception by cc-by-sa and MIT license