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

Spring WebFlux使用api1响应调用api2、api3构建最终响应及空值排查

错误原因梳理

  • 丢弃了response1.flatMap的返回值,WebFlux的流是懒加载的,没有加入到主调用链的流不会被执行,直接导致后续接口调用没有触发
  • 存在变量拼写错误,Mono.zip中用到的respons1、resppnse2都未提前声明赋值,本身就是空引用
  • 提前声明的RequestPayload requestPayload = null没有初始化,后续直接调用set方法会触发空指针,同时响应式流中使用外部可变变量本身就存在线程安全问题
  • 第二、第三个API的调用逻辑没有和第一个API的结果做关联,单独写在flatMap外部的Mono.zip无法拿到实际的接口返回值

正确实现代码

private Mono<RequestPayload> buildRequestPayload(Request request) {
    // 调用第一个接口获取response1
    return webclient1.get(request.getId())
            .flatMap(response1 -> {
                // 基于response1的id同时触发第二、第三个接口调用
                Mono<Response2> response2Mono = webclient2.getDetails(response1.getId());
                Mono<Response3> response3Mono = webclient3.getDetails(response1.getId());
                // 组合三个接口的返回结果,注意替换泛型为你实际的接口返回类型
                return Mono.zip(Mono.just(response1), response2Mono, response3Mono);
            })
            .map(tuple -> {
                // 直接在流内部构造返回对象,避免使用外部可变变量
                RequestPayload requestPayload = new RequestPayload();
                requestPayload.setResponse1(tuple.getT1());
                requestPayload.setResponse2(tuple.getT2());
                requestPayload.setResponse3(tuple.getT3());
                return requestPayload;
            });
}

空值排查技巧

  • 在每个接口调用后增加doOnNext日志打印,确认每个接口的返回结果是否符合预期,示例:webclient1.get(request.getId()).doOnNext(res -> log.info("response1返回结果:{}", res))
  • 增加doOnError日志打印异常栈,避免异常被吞导致无报错但返回空值
  • 确保所有响应式操作都在链式调用内完成,不要单独声明Mono变量后丢弃其返回值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:45:03