@Getter
@NoArgsConstructor
public class AResponseDto {
private String code;
private String message;
private BDataDto data;
public AResponseDto(BDataDto data) {
this.code = "200";
this.message = "요청 성공";
this.data = data;
}
}
위의 responseDto를 ResponseEntity body에 넣어 응답을 하는 로직에서 발생하는 에러를 만났다. 에러 메시지는 아래와 같다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class (경로 상 Dto) and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: (생성자 인자로 넘어온 data)
해결 방법은 아래와 같다ㅋㅋㅋ
Jackson이 AResponseDto의 BDataDto를 찾을 수 없어 발생하는 문제였다.
BDataDto의 클래스 레벨에 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 어노테이션을 붙여 해결하였다.
이유는 이러하다.
우선 스프링은 기본적으로 RestController를 이용하여 응답할 때 JSON을 잘 뱉어주는데ㅋㅋ 해당 데이터가 JSON으로 바뀌는 것을 Jackson이라는 녀석이 도와준다.
JSON 응답은 최종적으로 AResponseDto가 응답으로 나가는 것이지만 AResponseDto 생성 시점에 이미 만들어진 데이터 즉, BDataDto가 넘어오고 ResponseEntity의 body에 담겨 넘어가면서 응답을 하게된다.
하지만 BDataDto class는 public한 클래스이지만 필드가 private로 제한이 되어있어 문제가 발생한다.
에러 메시지의 'No serializer found for class'에서 serializer가 BDataDto를 못찾았기 때문이다.