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

