当前位置: 首页 > 知识库问答 >
问题:

Spring reactive WebClient使用内容类型“text/plain;charset=UTF-8”获取json响应

翟嘉年
2023-03-14

当我请求一个endpoint返回内容类型为“text/plain;charset=UTF-8”的正确格式的json响应时,我遇到了Spring5 reactive WebClient的问题。例外情况是

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)
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)

默认情况下,Jackson2EncoderJackson2Decoder都不支持String类型的元素。相反,默认的假设是一个字符串或字符串序列表示序列化的JSON内容,由CharSequenceEncoder呈现。如果您需要从flux 呈现一个JSON数组,请使用flux#collecttolist()并编码一个mono

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

共有1个答案

龚振
2023-03-14

万一有人需要,下面是解决方案:

这个答案(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();
...

干杯!

 类似资料: