diff --git a/blade-core-cloud/src/main/java/org/springblade/core/cloud/feign/BladeFeignFallback.java b/blade-core-cloud/src/main/java/org/springblade/core/cloud/feign/BladeFeignFallback.java index 24e630b..3f6e72b 100644 --- a/blade-core-cloud/src/main/java/org/springblade/core/cloud/feign/BladeFeignFallback.java +++ b/blade-core-cloud/src/main/java/org/springblade/core/cloud/feign/BladeFeignFallback.java @@ -106,7 +106,16 @@ public class BladeFeignFallback implements MethodInterceptor { if (resultNode.has(CODE)) { // 支持 R 及其子类(如 FR)的泛型反序列化,保留服务端失败原因 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()); }