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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:13