如何修改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
相关产品推荐
相关产品推荐

