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
相关产品推荐
相关产品推荐

