如何在Mono<A>发生错误时返回Mono<B>类型响应?
解决Reactor错误场景下返回不同类型响应的问题
这个问题是Reactor处理错误恢复的典型场景,你之前用的doOnError/onError属于副作用操作符,只能在错误发生时执行逻辑但无法改变流的最终类型;onErrorMap则是用来转换异常类型,依然会传递错误而非返回目标响应。真正适合的是onErrorResume操作符——它允许你捕获异常后,返回一个全新的、成功的Mono<B>流,完美匹配你的需求。
修改后的代码示例
public Mono<B> someMethod(Object arg) { Mono<A> monoA = Mono.just(arg) .flatMap(adapter1::doSomething); return monoA // 成功链路:将A转换为成功响应B .map(B::buildSuccessResponse) // 错误链路:捕获所有异常,返回错误响应B .onErrorResume(throwable -> { // 这里可以根据异常类型做针对性处理,比如判断异常 instanceof 特定类型 B errorResponse = B.buildErrorResponse(throwable.getMessage()); // 返回包装了错误响应的成功Mono return Mono.just(errorResponse); }); }
关键细节说明
onErrorResume的作用:它是一个恢复操作符,当上游流抛出异常时,会终止原流并执行你提供的逻辑,返回一个新的流。这里我们返回的是包含错误响应B的Mono,所以整个方法的返回类型始终是Mono<B>,无论成功还是错误。- 上下文访问:如果你的
buildErrorResponse需要用到原始参数arg,直接在onErrorResume的lambda中引用即可(arg是方法参数,属于effectively final,可以直接访问):.onErrorResume(throwable -> { B errorResponse = B.buildErrorResponse(arg); return Mono.just(errorResponse); }); - 异常类型过滤:如果你只想处理特定类型的异常,可以用
onErrorResume的重载版本,先指定异常类型:.onErrorResume(IllegalArgumentException.class, ex -> { B errorResponse = B.buildErrorResponse("非法参数:" + ex.getMessage()); return Mono.just(errorResponse); }) // 可以链式调用处理其他异常 .onErrorResume(IOException.class, ex -> { B errorResponse = B.buildErrorResponse("IO错误:" + ex.getMessage()); return Mono.just(errorResponse); });
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

