合并两个Mono对象返回ResponseEntity?控制器无回调返回空响应
问题分析与修复方案
问题根源
flatMap分支未返回Mono流
原代码中flatMap的lambda内部,if(sessionInfo!=null)块里调用redisController.confirm(...).map(...)后没有返回这个Mono,导致这段异步逻辑完全脱离响应链,相当于只定义了逻辑但没执行,控制器自然无内容返回。缺失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
相关产品推荐
相关产品推荐

