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

如何在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:43