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

Spring Boot WebFlux客户端发送Flux请求报错,求解决方案

Spring Boot WebFlux客户端发送Flux请求的问题解答

当然支持客户端向服务端发送Flux请求啦!你遇到的报错是因为服务端的参数声明和环境配置有问题,咱们一步步来解决:

错误原因分析

从你的报错信息里能看到两个关键问题:

  1. Jackson无法反序列化抽象类:报错提示Cannot construct instance of org.reactivestreams.Publisher,因为你用了抽象的Publisher作为@RequestBody的参数类型,Jackson不知道该实例化哪个具体实现类。
  2. 服务端可能混合了Spring MVC环境:报错栈里出现了spring-webmvc的类(比如RequestResponseBodyMethodProcessor),这说明你的服务端可能同时引入了Spring MVC和WebFlux依赖,导致请求被Spring MVC的处理器处理,而非WebFlux的流式处理器。

解决方案

1. 修正服务端控制器的参数类型

把抽象的Publisher<Integer>改成具体的Flux<Integer>,WebFlux的消息转换器能正确识别并流式处理Flux类型的请求体:

@PostMapping(
    value = "/stream/numbers2",
    produces = MediaType.APPLICATION_STREAM_JSON_VALUE,
    consumes = MediaType.APPLICATION_STREAM_JSON_VALUE
)
public Flux<StreamNumber> streamNumbers2(@RequestBody Flux<Integer> request) throws InterruptedException {
    log.info("streamNumbers API ");
    return Flux.from(request).map(item -> {
        try {
            Thread.sleep(1000);
            StreamNumber sn = new StreamNumber();
            sn.setOriginNumber(item);
            sn.setNewNumber(item + 1);
            sn.setOperation("Plus 1");
            return sn;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new StreamNumber(0, 0, "Error");
    }).doOnNext(item -> log.info("Number: {}", item));
}

2. 确保服务端是纯WebFlux环境

检查你的依赖配置:

  • 如果用Spring Boot,只需要引入spring-boot-starter-webflux,不要同时引入spring-boot-starter-web(后者会自动引入Spring MVC)。
  • 若手动管理依赖,排除所有Spring MVC相关的jar包,确保只有WebFlux的依赖生效。

3. 客户端代码无需修改

你的客户端用WebClient发送Flux请求的写法是完全正确的,WebClient会自动把Flux序列化为流式JSON请求体,和服务端的流式处理逻辑匹配。

验证效果

修正后,客户端发送的Flux<Integer>会被服务端流式接收,每收到一个整数就实时处理并返回对应的StreamNumber,实现全流式的请求响应交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:05