【发布时间】:2020-07-30 03:33:39
【问题描述】:
我在使用 Spring 5 响应式 WebClient 时遇到问题,当我请求一个端点,该端点返回格式正确的 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)
编辑:标题已“正确”设置(接受、内容类型),我尝试了不同的内容类型(json、json + UTF8、纯文本、纯文本 + UTF8)组合,没有成功。我认为问题是.bodyToFlux(MyDTOClass.class) 不知道如何将“文本”翻译成MyDTOClass 对象。
如果我将请求更改为:
webClient.get().uri(endpoint).retrieve().bodyToFlux(String.class)
我可以读取字符串。
EDIT 2:下一句摘自 Spring 文档 (https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-codecs-jackson)
默认情况下
Jackson2Encoder和Jackson2Decoder都不支持String类型的元素。相反,默认假设是 字符串或字符串序列表示序列化的 JSON 内容,以 由CharSequenceEncoder呈现。如果你需要的是渲染 来自Flux<String>的 JSON 数组,使用Flux#collectToList()并编码Mono<List<String>>.
我认为解决方案是定义一个新的解码器/读取器,以便将字符串转换为 MyDTOClass,但我不知道该怎么做。
【问题讨论】:
-
你可以试试
this.webClient = WebClient.builder() .baseUrl(clientUrl) .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_UTF8_VALUE) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE) .build(); -
这个问题与我的请求头无关,我已经在帖子中解释过了。
-
您是否尝试将响应映射为字符串并将其打印出来仅用于调试目的?只是为了确定会发生什么作为回应。还有一件事端点返回的是什么?就像端点返回的响应真的可以映射到您的 DTO 中?
-
您也可以在这里发布您的 DTO 课程吗?
-
是的,如果我使用
.bodyToFlux(String.class)并且我的 DTO 与响应完全匹配,我可以读取字符串。我手动将响应提取到资源目录中名为response.json的文件中,然后我将网络客户端指向localhost/response.json 可以毫无问题地读取它,如果我将文件扩展名更改为response.txt它会引发相同的异常。
标签: spring-boot jackson reactive-programming spring-webflux