No serializer found for class 오류

poogie·2022년 3월 17일
1
post-custom-banner

.시작하기전에

상품리스트 api를 만들기 위해 ArrayList에 상품정보와 이미지id리스트를 가공하여 내려주는 로직을 작성하고 있었다.

.오류탐색

에러문구는 다음과 같다.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException : No serializer found for class com.jnjlabs.amiparure.product.dto.ProductDto$ListRes and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.jnjlabs.amiparure.common.response.Response["data"]->java.util.ArrayList[0])

번역해보니 ArrayList에 넣은 리스펀스DTO의 직렬변환기가 없다는 내용이다.
이해가 좀 어려워 에러문구 그대로 구글링해보니 StackOverflow에 게시글이 하나있었다.

.구글링

(출처 https://stackoverflow.com/questions/8367312/serializing-with-jackson-json-getting-no-serializer-found)

코드는 많이 다른 구조지만 나랑 비슷한 에러문구에 어려움을 겪고있는 게시글의 답변이다.
번역해보면 ObjactMapper는 Public이거나 Getter/Setter가 있는 Class에만 동작한다고 한다.

나또한 Jackson으로부터 에러문구가 발생되었고, StackOverflow에서는 Jackson의 Class인 ObjectMapper에서의 문제라고 하는것으로 보아 맞는것같다.

.발생원인(추측)

그래서 ObjectMapper의 역할부터 찾아보았다.

(출처 : https://www.tutorialspoint.com/jackson/jackson_objectmapper.htm)

Json을 커스텀해주는 Class라고 이해하면 될것같다.

오피셜은 구글링해보아도 찾을 수 없었지만 추측은 해보았는데 과거 직장에서 Angular1.x로 개발에 1년정도 참여해본 경험이있는데 HttpEntity를 이용하여 내려주었고 Response들은 항상 Json상태였다.
그래서 내 코드와 비교해보면 ResponseEntity가 Json으로 변환을 위해 Jackson.ObjectMapper를 이용해 변환을 해보려했지만 내가 ArrayList에 넣은 DTO는 Getter속성이 없기때문에 ArrayList[0]에서부터 문제가 발생했다는 가설이 완성된다.

.문제해결

실제로 DTO에 @Getter 어노테이션을 넣어주니 해결되었다.
지금까지는 Entity에 @Getter 어노테이션을 달아놓고 있었기에 알지못했던 요소였다.

오피셜을 찾는데 2일정도 소모하였지만 코드도 문서도 찾을 수 없어 아쉽지만 여기서 마무리하고 마저 개발을 이어가기로했다.

profile
불안한 개발자
post-custom-banner

0개의 댓글