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
相关产品推荐
相关产品推荐

