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); });
关键说明
- exchangeToMono内部处理状态分支:
- 对2xx和404的正常分支直接返回对应布尔值
- 其他状态通过
response.createException()生成对应WebClientResponseException,再用Mono.error()抛出,进入异常流
- 外部用onErrorMap处理异常:
onErrorMap操作符专门接收Function<Throwable, Throwable>类型的参数,正好匹配你需要的带Throwable参数的mapErrorFunction- 在这里可以完成异常转换、封装等逻辑
结论
不需要替换exchangeToMono,它完全能满足你的业务场景需求,只需调整异常处理的位置即可。
内容的提问来源于stack exchange,提问作者user3083022
相关产品推荐
相关产品推荐

