spring-webmvc 4.3.x와 5.x.x의 차이 - HttpMessageNotWritableException
상황
spring-webmvc 4에서 5로 버전업하면서 특정 컨트롤러에서 아래 에러 발생
org.springframework.http.converter.HttpMessageNotWritableException:
No converter for [class dev.umbum.MyExceptionResponse] with preset Content-Type 'application/vnd.ms-excel'
@GetMapping("/excel")
public MyResponse 문제의_컨트롤러(HttpServletResponse response, MyRequest request) {
response.setContentType("application/vnd.ms-excel"); // <-- 이 부분
... // throw RuntimeException
}
// global exception handler
@ExceptionHandler({RuntimeException.class})
public ResponseEntity<MyExceptionResponse> handleDefaultRuntimeException(...) {
return new ResponseEntity<>(
new MyExceptionResponse(), HttpStatus.INTERNAL_SERVER_ERROR
);
}
원인
spring-webmvc 5.0.x 부터는 outputMessage (HttpServletResponse)에 ContentType이 설정되어 있으면 이 값으로 고정해서 MessageConverter를 찾는다. (설정 안되어 있으면 로직으로 찾는다.)
spring-webmvc 5.0.x의 AbstractMessageConverterMethodProcessor.java#L206-L252
반면 spring-webmvc 4.3.x 에서는 outputMessage (HttpServletResponse)에 ContentType이 설정되어 있든 아니든 무시하고 적절한 mediaType을 탐색한다.
spring-webmvc 4.3.x의 AbstractMessageConverterMethodProcessor.java#L175-L217
해결
response에 ContentType 설정하는 부분을 return 직전으로 옮김.
'Java Stack > Spring' 카테고리의 다른 글
spring-webmvc 에서 SpringBoot로 단계별로 전환하기 (0) | 2023.04.01 |
---|---|
[Spring] EventListener (0) | 2022.04.17 |
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상 (0) | 2022.01.12 |
[Spring] DB 관련 : Mybatis CustomTypeHandler (0) | 2021.03.31 |
[Spring] WebClient (0) | 2021.03.14 |