LostCatBox

(Issue) ResponseBodyAdvice에서 ClassCastException 발생

Word count: 258Reading time: 1 min
2023/04/13 Share

ResponseBodyAdvice에서 ClassCastException 발생

String 클래스를 반환하는 컨트롤러의 매서드에서 문제 발생

이슈 상황

기대

  • Controller(@RestController 포함)에서 응답 return 시, ResponseBodyAdvice의 구현체 코드 중 beforeBodyWrite() 실행되어, JsonResponse 객체를 Json형식으로 유저에게 응답

현실

  • 아래 조건에서 java.lang.ClassCastException 에러발생
  • ResponseBodyAdvice의 구현체 코드 중 일부
1
2
3
4
5
6
7
8
9
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
JsonResponse result = new JsonResponse();
result.setCode(CommonResponse.SUCCESS.getCode());
result.setMessage(CommonResponse.SUCCESS.getMessage());
result.setData(body);

return result;
}
  • Controller 코드 중 일부
1
2
3
4
@DeleteMapping("/{systemCode}")
public String deleteCode(@PathVariable String systemCode){
return "";
}

원인

1
2
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')
at org.springframework.http.converter.StringHttpMessageConverter.addDefaultHeaders(StringHttpMessageConverter.java:44) ~[spring-web-5.3.27-SNAPSHOT.jar:5.3.27-SNAPSHOT]

ResponseBodyAdvice@responsebody@HttpMessageConverter사이에서 동작하게되는데, 이때는 이미 ConverterType이 지정되어 있었다.

따라서 ResponseBodyAdvice 안에 beforeBodyWrite() 메서드를 호출할 때는 객체(JsonResponse)를 넣는다고 해도, HttpMessageConverterStringHttpMessageConverter 로 선택된 상태이기 때문에,
객체들을 해당 컨버터로 직렬화할 수 없었다.

@RestController에서는 view-name을 찾지 않고, responsebody로 해당내용을 반환한다.

해결

  • String이 아닌 객체를 반환하는 컨트롤러 메서드로 수정
  • void를 해도 HttpMessageConvertermappingjackson2httpmessageconverter 디폴트라서 문제없음
1
2
3
4
5
6
@DeleteMapping("/{systemCode}")
public void deleteCode(@PathVariable String systemCode){

cmCodeService.deleteOneCode(systemCode);

}
CATALOG
  1. 1. ResponseBodyAdvice에서 ClassCastException 발생
  2. 2. 이슈 상황
    1. 2.1. 기대
    2. 2.2. 현실
    3. 2.3. 원인
    4. 2.4. 해결