ResponseBodyAdvice에서 ClassCastException 발생
String 클래스를 반환하는 컨트롤러의 매서드에서 문제 발생
이슈 상황
기대
- Controller(@RestController 포함)에서 응답 return 시, ResponseBodyAdvice의 구현체 코드 중 beforeBodyWrite() 실행되어, JsonResponse 객체를 Json형식으로 유저에게 응답
현실
- 아래 조건에서
java.lang.ClassCastException
에러발생 - ResponseBodyAdvice의 구현체 코드 중 일부
1 |
|
- Controller 코드 중 일부
1 | "/{systemCode}") ( |
원인
1 | java.lang.ClassCastException: class com.tving.clone.controller.dto.response.json.JsonResponse cannot be cast to class java.lang.String (com.tving.clone.controller.dto.response.json.JsonResponse is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap') |
ResponseBodyAdvice
는 @responsebody
와 @HttpMessageConverter
사이에서 동작하게되는데, 이때는 이미 ConverterType
이 지정되어 있었다.
따라서 ResponseBodyAdvice
안에 beforeBodyWrite()
메서드를 호출할 때는 객체(JsonResponse)를 넣는다고 해도, HttpMessageConverter
가 StringHttpMessageConverter
로 선택된 상태이기 때문에,
객체들을 해당 컨버터로 직렬화할 수 없었다.
@RestController에서는 view-name을 찾지 않고, responsebody로 해당내용을 반환한다.
해결
- String이 아닌 객체를 반환하는 컨트롤러 메서드로 수정
- void를 해도
HttpMessageConverter
가mappingjackson2httpmessageconverter
디폴트라서 문제없음
1 | "/{systemCode}") ( |