如何自定义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
相关产品推荐
相关产品推荐

