You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义Spring WebClient以支持application/javascript并反序列化JSON

解决Spring WebClient处理application/javascript类型JSON响应的问题

要让WebClient正确处理CoinDesk API返回的application/javascript类型JSON响应,只需修改WebClient的消息转换器,让Jackson转换器支持该媒体类型即可,具体实现有两种常用方式:

方式一:修改默认Jackson消息转换器

创建自定义WebClient实例时,获取默认的Jackson JSON转换器,将application/javascript添加到它支持的媒体类型列表中:

@Bean
public WebClient coinDeskWebClient() {
    Jackson2JsonHttpMessageConverter jacksonConverter = new Jackson2JsonHttpMessageConverter();
    // 让Jackson转换器识别application/javascript类型
    jacksonConverter.getSupportedMediaTypes().add(MediaType.valueOf("application/javascript"));

    return WebClient.builder()
            .baseUrl("https://api.coindesk.com")
            .exchangeStrategies(ExchangeStrategies.builder()
                    .codecs(configurer -> configurer.defaultCodecs().jackson2JsonMessageConverter(jacksonConverter))
                    .build())
            .build();
}

方式二:添加自定义消息转换器(可选)

如果不想修改默认转换器,也可以单独添加一个仅处理application/javascript的Jackson转换器:

@Bean
public WebClient coinDeskWebClient() {
    Jackson2JsonHttpMessageConverter customConverter = new Jackson2JsonHttpMessageConverter();
    customConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/javascript")));

    return WebClient.builder()
            .baseUrl("https://api.coindesk.com")
            .exchangeStrategies(ExchangeStrategies.builder()
                    .codecs(configurer -> configurer.customCodecs().register(customConverter))
                    .build())
            .build();
}

调用示例

定义对应响应结构的实体类(以CoinDesk BPI响应为例):

public class CoinDeskResponse {
    private Bpi bpi;
    private String time;
    // 省略getter、setter

    public static class Bpi {
        private Currency usd;
        private Currency gbp;
        private Currency eur;
        // 省略getter、setter
    }

    public static class Currency {
        private String code;
        private String symbol;
        private String rate;
        private String description;
        private double rate_float;
        // 省略getter、setter
    }
}

使用自定义WebClient发起请求:

@Autowired
private WebClient coinDeskWebClient;

public Mono<CoinDeskResponse> fetchBpiData() {
    return coinDeskWebClient.get()
            .uri("/v1/bpi/currentprice.json")
            .retrieve()
            .bodyToMono(CoinDeskResponse.class);
}

注意事项

  • 建议为这类特殊API创建独立的WebClient实例,避免修改全局消息转换器影响其他正常请求。
  • 实际项目中尽量使用响应式编程(返回Mono/Flux),避免直接调用block()阻塞线程。

内容的提问来源于stack exchange,提问作者eHayik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:47:27