cannot deserialize from Object value 에러

wisdom·2022년 8월 21일
1

트러블슈팅

목록 보기
6/12

발생한 문제

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.insta.dto.article.ArticleRequestDto]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.insta.dto.article.ArticleRequestDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)


해결 과정

  • 에러메시지에 있는 cannot deserialize from Object value 를 구글링했다.
  • 원인은 jackson library가 빈 생성자가 없는 모델을 생성하는 방법을 몰라서 발생하는 에러였다. 에러메시지에서 힌트를 주고 있는 ArticleRequestDto 에 빈 생성자를 추가해주면 문제는 해결된다.
  • 그런데 왜 기본 생성자를 추가해줘야 하는 걸까? 에 의문을 갖게 됐다.
    - 결론은 JSON 데이터를 Java Object로 변환하기 위해서 필요하기 때문!

참고

POST 요청 @RequestBody 로 넘어오는 객체에는 기본 생성자가 필요

  • 스프링에서 JSON형 변환을 담당하는 것은 Jackson2HttpMessageConverter 이다.
  • @RequestBody 로 JSON 데이터가 넘어오면 Java Object 변환은 Jackson2HttpMessageConverter에서 해준다.
  • 더 들어가면 Jackson2HttpMessageConverterObjectMaper를 사용해서 Object로 전환해준다.

GET 요청의 경우는?

  • JSON 데이터가 아닌 Query Parameter 이다. 그래서 Jackson2HttpMessageConverter 가 아니라 WebDataBinder 를 사용한다.

해결

  • 아래 코드 추가
protected ArticleRequestDto(){}

회고

  • 주로 JSON 데이터를 받아서 개발을 하는데 그 작업을 담당하는 Jackson2HttpMessageConverter 이 어떻게 동작하는지는 당연히 알아야되지 않을까? 테스트 코드를 작성해서 확인할 수 있는 방법이 있던데 다음에 도전해봐야겠다.
  • 해당 이슈에 대해서 계속 찾아보니 자바 reflection 에 대해서도 공부해야할 필요성을 느꼈다.
profile
문제를 정의하고, 문제를 해결하는

0개의 댓글