WebFlux响应式控制器onErrorResume不生效原因及解决方案咨询
问题诱因
核心问题是错误使用map操作符处理响应式返回值:
golamService.findById作为MongoDB响应式查询接口,本身返回值为Mono<T>类型- 你使用
map操作符时,只会将返回的Mono实例作为外层流的普通元素传递,内层Mono的数据库调用逻辑不会被触发订阅,其产生的错误信号也不会流入外层响应流,因此外层的onErrorResume完全无法捕获到数据库断连的异常 - 当前写法下,数据库查询逻辑实际根本没有执行,无论数据库是否连通,都会直接走成功分支返回UP
解决方案
将处理findById的map操作符替换为flatMap即可,flatMap会将内层的MongoDB查询流和外层控制器返回的主流合并,内层的错误信号可以正常向下游传递,被onErrorResume捕获。
同时补充空结果兼容逻辑,避免查询的ID不存在时流无响应:
@RequestMapping("/liveness-for-kubernates/{id}") @ResponseBody public Mono<ResponseEntity<String>> livenessForKubernates(@PathVariable @NotBlank String id) { return Mono.just(id) // 替换map为flatMap,拼接内层查询流 .flatMap(golamService::findById) // 空结果处理:只要数据库连通,就算ID不存在也返回UP .switchIfEmpty(Mono.just(new ResponseEntity<>("UP", HttpStatus.OK))) .map(result -> new ResponseEntity<>("UP", HttpStatus.OK)) .onErrorResume( throwable -> Mono.just(new ResponseEntity<>("DOWN", HttpStatus.OK))); }
内容的提问来源于stack exchange,提问作者SkyBlackHawk
相关产品推荐
相关产品推荐

