Feign Client如何处理两种JSON响应并判断是否需修改方法返回类型
解决方案
1. 返回类型调整建议
你当前的ResponseEntity<T>泛型写法无法直接兼容两种完全异构的JSON响应结构(对象/数组),Jackson默认反序列化会直接抛出类型不匹配异常,所以必须调整返回类型,可选调整方案如下:
- 方案1:将泛型指定为Jackson的
JsonNode类型,即ResponseEntity<JsonNode>,可以直接兼容任意JSON结构,无需额外处理反序列化逻辑 - 方案2:直接用
ResponseEntity<String>接收原始响应字符串,自己手动做反序列化解析 - 方案3:自定义Feign解码器,根据JSON结构自动映射为对应类型的Java对象,返回类型可以定义为
ResponseEntity<Object>
2. 响应类型判断方法
最简便方案:用JsonNode接收后判断结构
拿到响应体后直接判断节点类型即可:
ResponseEntity<JsonNode> response = yourFeignClient.postXXX(请求参数); JsonNode body = response.getBody(); if (body.isObject()) { // 匹配成功响应,提取payment_uuid字段 String paymentUuid = body.get("payment_uuid").asText(); // 处理成功逻辑 } else if (body.isArray()) { // 匹配错误响应,提取错误提示 List<String> errorMsgs = new ObjectMapper().convertValue(body, new TypeReference<List<String>>() {}); // 处理错误逻辑 }
强类型方案:自定义解码器映射不同POJO
如果需要严格的类型校验,可以先定义两个对应结构的POJO:
// 成功响应类 @Data public class PaymentSuccessResp { private String paymentUuid; } // 错误响应类 public class PaymentErrorResp extends ArrayList<String> {}
之后自定义FeignDecoder,判断响应体第一个非空字符:
- 若为
{,反序列化为PaymentSuccessResp - 若为
[,反序列化为PaymentErrorResp
上层调用时直接用instanceof判断类型即可:
ResponseEntity<Object> response = yourFeignClient.postXXX(请求参数); Object body = response.getBody(); if (body instanceof PaymentSuccessResp successResp) { String uuid = successResp.getPaymentUuid(); } else if (body instanceof PaymentErrorResp errorResp) { String errorMsg = errorResp.get(0); }
补充说明
如果该接口的错误场景返回的是非2xx状态码,你可以优先通过response.getStatusCode().is2xxSuccessful()先判断响应状态,再对应解析响应体即可,不需要先判断JSON结构。
内容的提问来源于stack exchange,提问作者Maksym Rybalkin
相关产品推荐
相关产品推荐

