본문 바로가기

Language & Framework/삽질기록

삽질 기록 (2) 테스트 중 만난 Dto의 'Cannot construct instance of..' 에러

 

 

 

org.springframework.web.util.NestedServletException: Request processing failed;
nested exception is org.springframework.http.converter.HttpMessageConversionException:
Type definition error: [simple type, class com.myproject.community.request.PostCreate]; 
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct 
instance of `com.myproject.community.request.PostCreate` (no Creators, like default constructor, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)

 

 

이런 에러를 만났다.

 

 

 

 

 

 

양심 고백하자면 에러 코드 안 읽고 테스트 코드 잘못 작성한 줄 알고 그 쪽만 뒤적거리면서 1시간 날렸다.

반성합니다..

 

Builder 사용 시 AllArgConstuctor를 붙여주던지 아니면 직접 모든 상태를 포함하는 생성자를 만들어줘야하는 것은 알고 있었는데

 

나는 이미 모든 상태를 포함한 생성자를 가지고 있다.

그럼 원인이 뭘까요.

 

 

 

 

 

 

 

 

해결책은 간단했다. 기본 생성자만 만들어주면 된다.

ObjectMapper가 @RequestBody를 바인딩할 때 기본 생성자를 사용하기 때문이다.

 

다만 접근 지시자를 protected로 설정했을 때 어떻게 이걸 가져가는지 궁금해서 찾아봤다.

놀랍게도 constructor를 reflection API로 빼가서 데이터를 강제로 주입하고 있었다.

 

무서운 녀석.. 

지금까지 dto에 Setter를 붙인 것도 쓸데 없는 일이였다는 걸 깨달은 뜻깊은 시간이였다.

 

끝.