Spring Boot WebFlux客户端发送Flux请求报错,求解决方案
Spring Boot WebFlux客户端发送Flux请求的问题解答
当然支持客户端向服务端发送Flux请求啦!你遇到的报错是因为服务端的参数声明和环境配置有问题,咱们一步步来解决:
错误原因分析
从你的报错信息里能看到两个关键问题:
- Jackson无法反序列化抽象类:报错提示
Cannot construct instance of org.reactivestreams.Publisher,因为你用了抽象的Publisher作为@RequestBody的参数类型,Jackson不知道该实例化哪个具体实现类。 - 服务端可能混合了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
相关产品推荐
相关产品推荐

