gpt4 book ai didi

spring-boot - Spring Reactive WebClient GET json 响应,内容类型为 "text/plain;charset=UTF-8"

转载 作者:行者123 更新时间:2023-12-04 00:01:11 39 4
gpt4 key购买 nike

我遇到了 Spring 5 响应式(Reactive) WebClient 的问题,当我请求一个端点返回格式正确的 json 响应,内容类型为“text/plain;charset=UTF-8”。
异常(exception)是

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)

我可以读取字符串。

编辑 2 : 下引用摘自Spring文档
( https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-codecs-jackson )

By default both Jackson2Encoder and Jackson2Decoder do not support elements of type String. Instead the default assumption is that a string or a sequence of strings represent serialized JSON content, to be rendered by the CharSequenceEncoder. If what you need is to render a JSON array from Flux<String>, use Flux#collectToList() and encode a Mono<List<String>>.



我认为解决方案是定义一个新的解码器/读取器,以便将字符串转换为 MyDTOClass,但我不知道该怎么做。

最佳答案

如果有人需要它,这是解决方案:

这个答案( https://stackoverflow.com/a/57046640/13333357 )是关键。我们必须添加一个自定义解码器,以指定反序列化响应的内容和方式。

但是我们必须记住这一点:类级别注释@JsonIgnoreProperties默认设置为 json 映射器,对其他映射器没有影响。因此,如果您的 DTO 不匹配所有响应“json”属性,反序列化将失败。

以下是如何配置 ObjectMapper 和 WebClient 以从文本响应中反序列化 json 对象:

...
WebClient.builder()
.baseUrl(url)
.exchangeStrategies(ExchangeStrategies.builder().codecs(configurer ->{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
configurer.customCodecs().decoder(new Jackson2JsonDecoder(mapper, MimeTypeUtils.parseMimeType(MediaType.TEXT_PLAIN_VALUE)));
}).build())
.build();
...

干杯!

关于spring-boot - Spring Reactive WebClient GET json 响应,内容类型为 "text/plain;charset=UTF-8",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61257963/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com