如何从Spring WebClient的onStatus响应中返回List<String>?
解决WebClient处理HTTP 422时获取List响应体的问题
你的代码报错是因为onStatus方法的返回值要求是Mono<? extends Throwable>,但你直接返回了Mono<List<String>>,类型不匹配。onStatus的作用是将指定HTTP状态码转换为异常抛出,不能直接返回业务数据,要实现需求,需要通过自定义异常携带错误列表,步骤如下:
1. 自定义异常类
创建一个异常类,用来存储422响应体返回的错误列表:
public class ValidationErrorsException extends RuntimeException { private final List<String> errors; public ValidationErrorsException(List<String> errors) { this.errors = errors; } public List<String> getErrors() { return errors; } }
2. 修改WebClient调用逻辑
在onStatus中解析响应体的错误列表,包装成自定义异常并抛出:
try { // 替换为实际的正常响应类型 ValidationResponse normalResponse = webClient .post() .uri("/validation/{reference}", reference) .body(Mono.just(request), ValidationRequest.class) .retrieve() .onStatus(HttpStatus.UNPROCESSABLE_ENTITY, response -> // 解析响应体为List<String>,包装成自定义异常后抛出 response.bodyToMono(new ParameterizedTypeReference<List<String>>() {}) .map(ValidationErrorsException::new) .flatMap(Mono::error) ) .bodyToMono(ValidationResponse.class) .block(); } catch (ValidationErrorsException e) { // 获取422返回的错误列表 List<String> validationErrors = e.getErrors(); // 后续处理错误列表的逻辑 }
说明
onStatus的核心是将特定状态码转为异常,所以必须返回异常类型的Mono,不能直接返回业务数据。- 通过自定义异常,可以把响应体中的错误列表携带出来,在catch块中获取并处理。
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

