如何不阻塞地渲染包含两个Flux/Mono字段的响应式对象?
问题根因
你直接将Mono响应式对象本身赋值给GraphDataDTO的属性,JSON序列化框架无法感知响应式类型,只会序列化Mono实例本身的内部字段,才会出现scanAvailable这类异常字段,并非响应提前返回,而是你没有正确取出Mono包裹的实际业务数据。你之前使用zip不符合预期大概率是用法错误,没有将组合后的Mono作为整体返回,而是提前提取或者赋值到POJO属性中导致的。
非阻塞实现方案
使用Mono.zip组合两个异步请求的结果,直接返回组装后的Mono<GraphDataDTO>即可,Spring WebFlux 会自动等待响应流完成后再序列化返回结果,全程保持非阻塞:
// 组合两个Mono的执行结果,两个请求会并行执行 Mono<GraphDataDTO> graphDataDTOMono = Mono.zip(nodeDTOFlux, edgeDTOFlux) .map(tuple2 -> { GraphDataDTO graphDataDTO = new GraphDataDTO(); // 取第一个Mono的结果 即List<NodeDTO> graphDataDTO.setNodeDTOS(tuple2.getT1()); // 取第二个Mono的结果 即List<EdgeDTO> graphDataDTO.setEdgeDTOS(tuple2.getT2()); return graphDataDTO; });
注意事项
- Controller 层直接将上述
Mono<GraphDataDTO>作为接口返回值即可,不要手动调用block()方法,否则会破坏非阻塞特性,造成线程阻塞。 - 如果需要在业务层进一步处理组装后的
GraphDataDTO,继续在响应流上使用map/flatMap等操作符链式处理即可,无需提前取出结果。
内容的提问来源于stack exchange,提问作者Maroua Briki
相关产品推荐
相关产品推荐

