티스토리 뷰

Spring WebFlux로 API를 만드는 과정에서 이슈가 발생하였습니다.

Flux 타입을 응답할 때 당연히 JSON Array로 직렬화되어서 응답하는 줄 알았는데 반드시 그런 건 아니었습니다.

Flux<String> 타입일 경우 JSON Array로 직렬화가 되지 않은 이슈를 겪었는데요. 코드로 함께 살펴보겠습니다.

예제코드

Flux<Integer>와 Flux<String>을 반환하는 두 개의 API가 있습니다.

 

 

Flux<Integer>를 반환하는 API에 요청을 보내면 Content-Type이 application/json, Body는 JSON Array로 응답합니다.

 

하지만 Flux<String>을 반환하는 API에 요청을 보내면 Content-Type은 application/json이 아닌 text/plain으로 응답하고 Body 또한 JSON Array가 아니라 Array의 각 요소를 하나의 String으로 연결되어서 응답합니다.

 

해당 문제의 원인과 해결 방법을 파악하기 위해서 검색을 해봤고 공식 문서에서 다음과 같은 정보를 얻을 수 있었습니다.

 

원인파악

Note 부분을 해석하자면 다음과 같습니다.

 

기본적으로 Jackson2Encoder와 Jackson2Decoder 모두 String 유형의 요소를 지원하지 않습니다. 대신 문자열 또는 문자열 시퀀스가 CharSequenceEncoder에 의해 렌더링될 직렬화된 JSON 콘텐츠를 나타내는 것으로 기본 가정합니다. Flux<String>에서 JSON 배열을 렌더링해야 하는 경우 Flux#collectToList()를 사용하고 Mono<List<String>>를 인코딩합니다.

즉, Flux<String>을 JSON Array로 응답하려면 Flux의 collectToList 메서드를 호출하여 Mono<List<String>>로 반환해서 주면 됩니다.

 

 

문제해결

공식 문서에는 collectToList 라고 되어있지만 실제로는 그 메서드는 존재하지않고 collectList 라는 메서드가 존재합니다. 아마 메서드 이름이 변경되었는데 공식 문서 내용이 업데이트 되지않은 것 같습니다.

이제 Flux<String>을 Mono<List<String>>로 반환 후 다시 API 요청을 보내겠습니다.

 

 

아까와는 다르게 정상적으로 JSON Array로 직렬화되어서 응답되어진 걸 확인하실 수 있습니다.

 

 

참고

https://docs.spring.io/spring-framework/reference/web/webflux/reactive-spring.html#webflux-codecs-jackson

 

Reactive Core :: Spring Framework

The org.springframework.web.server package builds on the HttpHandler contract to provide a general-purpose web API for processing requests through a chain of multiple WebExceptionHandler, multiple WebFilter, and a single WebHandler component. The chain can

docs.spring.io

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함