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

Spring WebClient处理HEAD请求:状态码映射与异常抛出

解决方案:无需替换exchangeToMono,调整异常处理逻辑即可

核心思路

exchangeToMono本身就是为处理响应细节(如状态码分支)设计的,完全适配你的需求。问题出在异常处理的时机——带Throwable参数的mapErrorFunction需要在exchangeToMono外部通过异常处理操作符调用,而非在其内部末尾执行。

具体实现代码

webClient.head()
    .uri("/target-endpoint")
    .exchangeToMono(response -> {
        // 2xx状态返回true
        if (response.statusCode().is2xxSuccessful()) {
            return Mono.just(true);
        }
        // 404状态返回false
        else if (response.statusCode() == HttpStatus.NOT_FOUND) {
            return Mono.just(false);
        }
        // 其他状态码抛出对应异常
        else {
            return response.createException()
                .flatMap(Mono::error);
        }
    })
    // 在这里调用带Throwable参数的mapErrorFunction
    .onErrorMap(throwable -> {
        // 替换为你的异常转换逻辑,比如转自定义异常
        return yourMapErrorFunction(throwable);
    });

关键说明

  1. exchangeToMono内部处理状态分支:
    • 对2xx和404的正常分支直接返回对应布尔值
    • 其他状态通过response.createException()生成对应WebClientResponseException,再用Mono.error()抛出,进入异常流
  2. 外部用onErrorMap处理异常:
    • onErrorMap操作符专门接收Function<Throwable, Throwable>类型的参数,正好匹配你需要的带Throwable参数的mapErrorFunction
    • 在这里可以完成异常转换、封装等逻辑

结论

不需要替换exchangeToMono,它完全能满足你的业务场景需求,只需调整异常处理的位置即可。

内容的提问来源于stack exchange,提问作者user3083022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:07:05