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

Spring WebClient如何设置对象列表作为POST请求的请求体

错误原因

你现有代码存在3个核心问题:

  • 语法错误:webClient.post() 后多了未闭合的左括号,且返回值声明为void却返回了retrieve()的结果,类型不匹配
  • 类型指定错误:body方法的第二个参数传入Product.class时,Spring只会把传入的对象当做单个Product序列化,无法识别List泛型类型
  • 拼写错误:你提到的Products.class多了后缀s,和实际泛型参数不匹配

正确实现方案

方案1:使用ParameterizedTypeReference指定泛型类型

这是兼容性最好的通用写法,通过匿名类保留泛型信息,让Spring正确识别List<Product>类型完成序列化:

// 非阻塞场景直接返回Mono由上层订阅处理
public Mono<Void> postProducts(List<Product> products) {
    return this.webClient.post()
            .uri("/products")
            .body(Mono.just(products), new ParameterizedTypeReference<List<Product>>() {})
            .retrieve()
            .bodyToMono(Void.class);
}

// 同步阻塞场景可以直接声明void返回值
public void postProducts(List<Product> products) {
    this.webClient.post()
            .uri("/products")
            .body(Mono.just(products), new ParameterizedTypeReference<List<Product>>() {})
            .retrieve()
            .toBodilessEntity()
            .block();
}

方案2:简化写法(Spring 5.2+支持)

高版本Spring直接提供了bodyValue方法,不需要手动封装Mono,也不需要手动指定类型:

public Mono<Void> postProducts(List<Product> products) {
    return this.webClient.post()
            .uri("/products")
            .bodyValue(products)
            .retrieve()
            .bodyToMono(Void.class);
}

注意:如果接收接口要求的请求体格式是JSON数组,需要确保Product类已经正确配置Jackson序列化注解,且WebClient的编解码器已经正常注册。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:07