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

如何修改Spring WebClient的HTTP响应状态 将4XX转为2XX

实现思路

要修改WebClient返回的响应状态码,使用exchangeToMono方法可以直接拿到完整响应对象,自行映射处理后的状态和内容,是最灵活的实现方式。你之前的写法只抑制了4XX异常抛出,不会修改最终返回的状态码,调整后的实现如下:


推荐实现(exchangeToMono方案)

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

public Mono<ResponseEntity<String>> postMethodA(String valueA) {
    return webClient
            .put()
            .uri("/")
            .bodyValue(valueA)
            .exchangeToMono(response -> {
                // 匹配所有4XX状态码
                if (response.statusCode().is4xxClientError()) {
                    // 自定义返回2XX状态码,此处以200为例,可按需替换为201/202等其他2XX状态
                    return response.bodyToMono(String.class)
                            // 可选择保留原4XX响应的body,也可替换为自定义内容
                            .map(body -> ResponseEntity.ok(body))
                            // 若4XX响应无body,返回默认内容
                            .defaultIfEmpty(ResponseEntity.ok("请求处理完成"));
                }
                // 非4XX状态码保持原响应返回
                return response.toEntity(String.class);
            });
}

可选实现(retrieve + onErrorResume方案)

如果你更习惯使用retrieve()方法,也可以配合异常捕获逻辑实现:

public Mono<ResponseEntity<String>> postMethodA(String valueA) {
    return webClient
            .put()
            .uri("/")
            .bodyValue(valueA)
            .retrieve()
            // 让4XX状态码触发标准异常抛出
            .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse.createException())
            .toEntity(String.class)
            // 捕获4XX异常,转为自定义2XX响应
            .onErrorResume(org.springframework.web.reactive.function.client.WebClientResponseException.class, e -> {
                if (e.getStatusCode().is4xxClientError()) {
                    return Mono.just(ResponseEntity.ok(e.getResponseBodyAsString()));
                }
                // 非4XX异常继续向上抛出
                return Mono.error(e);
            });
}

注意事项

  • 使用exchangeToMono时必须完整消费响应体,避免出现内存泄漏,上述示例已通过bodyToMono/toEntity完成响应体消费,符合Spring WebClient使用规范
  • 可根据业务需求灵活调整返回的2XX状态码和响应内容,不需要保留原4XX响应内容时可直接返回自定义字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:24:03