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

WebClient返回200状态码但响应体含失败信息的处理方案咨询

解决方案

问题根因

你当前遇到的500错误是因为直接调用bodyToMono(ResponsePojo)时,200状态下的错误响应结构和ResponsePojo字段不匹配,导致JSON反序列化失败,Spring框架默认将该类未捕获的序列化异常映射为了500内部错误。

实现步骤

  • 第一步:定义自定义业务异常,用于封装业务错误信息
public class BusinessErrorException extends RuntimeException {
    private final String errorCode;
    private final String errorMessage;

    public BusinessErrorException(String errorCode, String errorMessage) {
        super(errorMessage);
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    // 按需添加getter、setter方法
}
  • 第二步:改造WebClient调用逻辑,先解析通用响应结构再做分支处理
return webClient.post()
        .uri("/example")
        .header("someHeader")
        .bodyValue(PojoBody)
        .retrieve()
        .onStatus(HttpStatus::isError, handleError)
        // 先转换为通用Json节点,避免直接序列化到目标类时结构不匹配报错
        .bodyToMono(JsonNode.class)
        .map(responseNode -> {
            // 以下判断逻辑根据你实际的响应字段调整,比如返回标识为success、code等
            boolean isBizSuccess = responseNode.path("success").asBoolean(true);
            if (!isBizSuccess) {
                String code = responseNode.path("errorCode").asText("BIZ_COMMON_ERROR");
                String msg = responseNode.path("errorMsg").asText("业务处理失败");
                throw new BusinessErrorException(code, msg);
            }
            // 业务状态正常时,再转换为目标响应类
            return new ObjectMapper().convertValue(responseNode, ResponsePojo.class);
        })
        // 可选:兜底处理响应结构完全不匹配的场景,避免反序列化异常直接抛出为500
        .onErrorMap(JsonProcessingException.class, e -> 
            new BusinessErrorException("RESPONSE_PARSE_FAILED", "响应解析失败:" + e.getMessage())
        );

批量场景优化

如果项目中大量接口都遵循同样的200返回业务错误的规范,可以把上述判断逻辑封装为统一的响应处理器,或者自定义BodyExtractor实现全局复用,不需要每个接口重复编写判断代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:06:03