본문 바로가기

프로그래밍/Spring

String(date foramt) in Json to LocalDateTime


JSON안에 아래와 같은 값이 들어있다. 

{

  "date-time": "2019-09-27T20:30:00+09:00"

}



아래의 Pojo에 자동으로 Converted 될거라고 기대하고 쭉 돌려본다. 

public class MyParameter {

@JsonProperty(value = "date-time")
ZonedDateTime dateTime;
}



두둥...


아래와 같이 에러 메시지가 발생했다 .


Cannot construct instance of `java.time.ZonedDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value




이래저래 많은 방법들이 있는 것 같은데 나는 아래 방법으로 해결 했다. 




build.gradle

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.4")




mapper.registerModule(new JavaTimeModule())

(mapper는 ObjectMapper이다.)






원인은 뭘까?


LocalDate는 Java8에 등장한 신규 피쳐이다. 

이전의 Date는 Thread-safe에도 문제가 있고, API도 엉망진창이다. 

그래서 Joda-time 등의 라이브러리를 사용하는 개발자가 많았다. 

자바 진영은 Joda-time 등의 라이브러리를 적극 참고해서 JSR310에 새로운 Date를 추가했다. 


이런 상황에서..


JPA의 경우에는 2.1 버전까지는 JDK8이 나오기 전에 만들어져서 LocalDate가 지원되지 않는다. 


Jackson도 마찬가지로 JSR310의 내용을 쓰기 위해서 디펜던시를 추가해줘야 하는 모양이다. 

Jackson의 serialization을 바꾸고 싶으면 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS 설정을 yml에서 조절해야 하는 듯 하다. 

자세한 건 블로그를 참고하자. 























'프로그래밍 > Spring' 카테고리의 다른 글

AWS + Spring boot + Java + Oauth + Mustache + JPA (sample project)  (0) 2020.04.28
REST API sample With Kotiln  (0) 2020.04.28
Spring AOP  (0) 2019.04.22
Annotation 정리  (0) 2019.04.05
Filter & Interceptor  (0) 2019.03.04