1 Commits
mk ... dev

Author SHA1 Message Date
weicw 2bf9de5450 🐛 Feign 降级响应无法按返回类型反序列化时降级为失败结果
服务端把 data:null 序列化成 {},客户端泛型为 Boolean 等标量时 convertValue
抛异常,被 BladeSentinelInvocationHandler 包成 AssertionError(Error 而非
Exception),击穿调用方的 catch (Exception),把可恢复的 4xx 升级成 500。
改为记 WARN 并返回 R.fail,保留服务端 code/msg。
2026-10-26 13:48:32 +08:00
@@ -106,7 +106,16 @@ public class BladeFeignFallback<T> implements MethodInterceptor {
if (resultNode.has(CODE)) { if (resultNode.has(CODE)) {
// 支持 R 及其子类(如 FR)的泛型反序列化,保留服务端失败原因 // 支持 R 及其子类(如 FR)的泛型反序列化,保留服务端失败原因
JavaType javaType = JsonUtil.getInstance().getTypeFactory().constructType(method.getGenericReturnType()); JavaType javaType = JsonUtil.getInstance().getTypeFactory().constructType(method.getGenericReturnType());
return JsonUtil.getInstance().convertValue(resultNode, javaType); try {
return JsonUtil.getInstance().convertValue(resultNode, javaType);
} catch (Exception convertException) {
// 服务端 data 被写成 {}(null 空值序列化)而客户端泛型是 Boolean 这类标量时无法反序列化。
// 此处抛出会被 BladeSentinelInvocationHandler 包成 AssertionError(Error 而非 Exception),
// 击穿调用方的 catch (Exception),把可恢复的 4xx 升级成 500,故一律降级为失败结果。
log.warn("BladeFeignFallback:[{}.{}] 响应体无法按 {} 反序列化,降级为失败结果:{}",
targetType.getName(), method.getName(), method.getGenericReturnType(), convertException.getMessage());
return R.fail(resultNode.path(CODE).asInt(ResultCode.FAILURE.getCode()), resultNode.path("msg").asText(errorMessage));
}
} }
return R.fail(resultNode.toString()); return R.fail(resultNode.toString());
} }