openapiJson
메소드를 호출했다. 메소드의 반환값은 byte[]였다. 이게 아마 api-docs가 출력한 base64url로 인코딩된 값인 듯 했다.ByteArrayHttpMessageConverter
가 변환을 수행해야 하나, 문제 상황에서는 MappingJackson2HttpMessageConverter
가 변환을 수행하고 있었다.Note that use of this method turns off default converter
registration
openapiJson
의 응답값을 처리할 converter를 처리하는 과정에서 MappingJackson2HttpMessageConverter가 처리를 담당하게 되었고, 정상적은 변환이 이뤄지지 않은 것이다.Spring은 Default MessageConverter를 유지하면서 MessageConverter를 수정하기 위한 메소드 extendMessageConverters
를 추가 제공한다.
메소드에 대한 설명은 아래와 같다.
Extend or modify the list of converters after it has been, either configured or initialized with a default list.
Note that the order of converter registration is important. Especially in cases where clients accept org.springframework.http.MediaType.ALL the converters configured earlier will be preferred.
스프링이 제공하는 Default Converter리스트는 아래와 같다.
0 = {ByteArrayHttpMessageConverter}
1 = {StringHttpMessageConverter}
2 = {ResourceHttpMessageConverter}
3 = {ResourceRegionHttpMessageConverter}
4 = {AllEncompassingFormHttpMessageConverter}
5 = {Jaxb2RootElementHttpMessageConverter}
6 = {MappingJackson2HttpMessageConverter}
override fun extendMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
//(converters[1] as? StringHttpMessageConverter)?.defaultCharset = StandardCharsets.UTF_8
//StringMessageConverter 기본 charset 변경
if (converters[1] is HttpMessageConverter) {
(converters[1] as StringHttpMessageConverter).defaultCharset = StandardCharsets.UTF_8
}
//kotlin data class나 lazyloding 기존 jackson mapper를 사용하면 문제가 생긴다고 한다.
//기존 MappingJackson2HttpMessageConverter앞에 Kotlin용 Mapper 추가
converters.add(6, MappingJackson2HttpMessageConverter(Jackson.mapper()))
}