如何在使用Mono.error(<Throwable>)时附加请求返回体信息?
如何在
Mono.error(<Throwable>)中附加请求响应体信息 针对你的疑问,我来逐一拆解并给出实用的解决方案:
问题1:是否存在继承Throwable的响应式对象,可接收Mono/Flux对象,使抛出的错误等待响应体处理完成?
答案是没有。因为Throwable是Java的同步异常类型,它本身完全不支持响应式(异步)的操作逻辑。响应体的读取是异步的(通过Mono<String>),你没办法把一个异步的Mono实例直接传给Throwable子类来实现"等待响应体处理完再抛错"的效果。
正确的思路是:先异步完成响应体的读取,在响应体处理完成的回调逻辑里,把响应体内容注入自定义异常,再通过Mono.error()抛出错误。这样整个流程会自然等待响应体读取完成后,才会触发错误信号。
问题2:能否为现有Mono对象添加某种‘标记’,使其立即失败(以规避必须使用Throwable的要求)?
Mono本身提供了直接触发失败的方法,但你的场景需要结合响应体内容,所以不能"立即"失败——毕竟必须先拿到响应体才能构建带有效信息的错误。如果是无条件的失败,你可以直接返回Mono.error(new YourException()),但这显然不符合你要附加响应体的需求。
对于你的场景,正确的实现方式是通过flatMap串联响应体读取和错误抛出的逻辑,而不是寻找什么特殊"标记"。
修改后的示例代码
首先定义一个自定义异常,专门用来携带响应体和状态码信息:
public class CustomClientResponseException extends RuntimeException { private final String responseBody; private final HttpStatus statusCode; public CustomClientResponseException(String message, HttpStatus statusCode, String responseBody) { super(message); this.statusCode = statusCode; this.responseBody = responseBody; } // 提供getter方法方便后续获取异常信息 public String getResponseBody() { return responseBody; } public HttpStatus getStatusCode() { return statusCode; } }
然后调整你的errorHandler方法,确保先完成响应体读取再抛出异常:
private Mono<? extends Throwable> errorHandler(ClientResponse cr) { // 先异步读取响应体,再在回调中构建带内容的异常 return cr.body(BodyExtractors.toMono(String.class)) .flatMap(responseBody -> { String errorMsg = String.format("请求失败,状态码:%s", cr.statusCode()); return Mono.error(new CustomClientResponseException(errorMsg, cr.statusCode(), responseBody)); }); }
这样修改后,当WebClient捕获到错误状态码时,会先完成响应体的异步读取,再抛出携带完整响应体信息的自定义异常,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Flavouski
相关产品推荐
相关产品推荐

