훈훈훈

Spring boot :: LocalDate Deserialize(serialize) 이슈 정리 본문

Spring Framework/Kotlin

Spring boot :: LocalDate Deserialize(serialize) 이슈 정리

훈훈훈 2020. 8. 30. 18:00

Spring boot와 Kotlin(코틀린)으로 Application 개발 중에 Jackson 라이브러리에서 LocalDate 타입을 Deserialize(serialize)를 하면서 발생했던 이슈를 정리해보려고 한다. 

 

 

-  오류 메시지

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value

 

 

-  문제 상황

 

 

Application A에서 Application B로 Request를 날리고 Response를 받을 때 LocalDate을 Deserialize를 하지 못해 발생

 

 

-  문제 원인

LocalDate(Time)은 Java 8에서 새로 만들어진 타입 

 

문제는 Jackson 라이브러리가 String 타입으로 표현된 데이터를 Deserialize 시 LocalDate를 제대로 변환하지 못하는 현상 발생

 

해당 내용은 baeldung에서 참고하였으며 자세한 내용은 해당 사이트에서 확인할 수 있다.

 

 

-  해결방법

먼저 Gradle 사용 시 아래와 같이 jsr310 의존성 추가

implementation('com.fasterxml.jackson.datatype:jackson-datatype-jsr310')

 

그리고 DTO나 Model에서 아래와 같이 어노테이션 추가 

data class exampleDTO(
    @JsonDeserialize(using = LocalDateDeserializer::class)
    val uploadDate: LocalDate,
)

 

Controller에서는 별도 수정 없이 아래와 같은 코드 사용

@GetMapping("/exampleApplicationA")
fun exampleController(): ResponseEntity<List<exampleDTO>> {
    val response = khttp.get(
        url = "exampleURL"
    )
    val mappedResponse: List<exampleDTO>  = objectMapper.readValue(res.content)

    return ResponseEntity.ok(mappedResponse)
}

 

위와 같이 코드를 수정 후 어플리케이션을 실행시키면 정상적으로 Response를 받는 것을 확인할 수 있다.

 

Comments