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

合并两个Mono对象返回ResponseEntity?控制器无回调返回空响应

问题分析与修复方案

问题根源

  1. flatMap分支未返回Mono流
    原代码中flatMap的lambda内部,if(sessionInfo!=null)块里调用redisController.confirm(...).map(...)后没有返回这个Mono,导致这段异步逻辑完全脱离响应链,相当于只定义了逻辑但没执行,控制器自然无内容返回。

  2. 缺失null分支的兜底处理
    当sessionInfo为null时,代码没有返回任何Mono实例,整个响应链直接中断,最终返回空白响应。

修复后的完整代码

@RestController
@RequestMapping("/view")
public class ManiController {

    @GetMapping("/{channelId}/**")
    public Mono<ResponseEntity<String>> manifest(@RequestParam(name = "sid", required = false) String sessionId) {
        return redisController.getData(sessionId)
                .flatMap(sessionInfo -> {
                    if (sessionInfo != null) {
                        // 必须返回该Mono,将异步逻辑纳入响应链
                        return redisController.confirm(sessionInfo)
                                .map(data -> new ResponseEntity<>(data, HttpStatus.OK));
                    } else {
                        // session为空时返回自定义兜底响应,可根据业务调整状态码和内容
                        return Mono.just(new ResponseEntity<>("Session not found", HttpStatus.NOT_FOUND));
                    }
                })
                // 兜底处理getData返回空Mono的场景(比如sid不存在或未传)
                .defaultIfEmpty(new ResponseEntity<>("Invalid session parameter", HttpStatus.BAD_REQUEST));
    }
}

关键修复点说明

  • 所有分支必须返回Mono类型实例:Reactor响应式编程中,只有将异步逻辑包装在Mono/Flux中并返回,框架才会订阅执行这段逻辑,否则会被丢弃。
  • defaultIfEmpty用于处理redisController.getData(sessionId)本身返回空Mono的情况(比如sid未传、redis中无对应数据),避免响应链中断。
  • 若业务允许session为空时返回200空响应,可将null分支改为:return Mono.just(new ResponseEntity<>(HttpStatus.OK))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:10:27