У меня проблема с реактивным WebClient Spring 5, когда я запрашиваю конечную точку, которая возвращает правильно отформатированный json ответ с типом содержимого "text / plain; charset = UTF-8". Исключение составляет
org.springframework.web.reactive.function.UnsupportedMediaTypeException:
Content type 'text/plain;charset=UTF-8' not supported for bodyType=MyDTOClass
Вот как я сделал запрос:
webClient.get().uri(endpoint).retrieve().bodyToFlux(MyDTOClass.class)
РЕДАКТИРОВАТЬ : заголовки «правильно» установлены (Accept, Content-Type) , Я пробовал разные типы содержимого (json, json + UTF8, текстовый текст, текстовый текст + UTF8) без успеха. Я думаю, что проблема в .bodyToFlux(MyDTOClass.class)
не знает, как перевести "текст" в MyDTOClass
объекты. Если я изменю запрос на:
webClient.get().uri(endpoint).retrieve().bodyToFlux(String.class)
, я смогу прочитать строку.
РЕДАКТИРОВАТЬ 2 : Следующая цитата извлечена из документации Spring ( https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux -codecs-jackson )
По умолчанию оба Jackson2Encoder
и Jackson2Decoder
не поддерживают элементы типа String
. Вместо этого по умолчанию предполагается, что строка или последовательность строк представляют сериализованное содержимое JSON, которое будет отображаться с помощью CharSequenceEncoder
. Если вам нужно визуализировать массив JSON из Flux<String>
, используйте Flux#collectToList()
и кодируйте Mono<List<String>>
.
Я думаю, что решение состоит в том, чтобы определить новый декодер / считыватель по порядку преобразовать строку в MyDTOClass, но я не знаю, как это сделать.