¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, DreamLu All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: DreamLu 墿¥æ¢¦ (596392912@qq.com) |
| | | */ |
| | | package org.springblade.core.cloud.feign; |
| | | |
| | | import com.fasterxml.jackson.databind.JsonNode; |
| | | import feign.FeignException; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springblade.core.tool.api.R; |
| | | import org.springblade.core.tool.api.ResultCode; |
| | | import org.springblade.core.tool.jackson.JsonUtil; |
| | | import org.springblade.core.tool.utils.ObjectUtil; |
| | | import org.springframework.cglib.proxy.MethodInterceptor; |
| | | import org.springframework.cglib.proxy.MethodProxy; |
| | | import org.springframework.lang.Nullable; |
| | | |
| | | import java.lang.reflect.Method; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * blade fallBack 代çå¤ç |
| | | * |
| | | * @author L.cm |
| | | */ |
| | | @Slf4j |
| | | @AllArgsConstructor |
| | | public class BladeFeignFallback<T> implements MethodInterceptor { |
| | | private final Class<T> targetType; |
| | | private final String targetName; |
| | | private final Throwable cause; |
| | | private final static String CODE = "code"; |
| | | |
| | | @Nullable |
| | | @Override |
| | | public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { |
| | | String errorMessage = cause.getMessage(); |
| | | log.error("BladeFeignFallback:[{}.{}] serviceId:[{}] message:[{}]", targetType.getName(), method.getName(), targetName, errorMessage); |
| | | Class<?> returnType = method.getReturnType(); |
| | | // éåç±»ååé¦ç©ºéå |
| | | if (List.class == returnType || Collection.class == returnType) { |
| | | return Collections.emptyList(); |
| | | } |
| | | if (Set.class == returnType) { |
| | | return Collections.emptySet(); |
| | | } |
| | | if (Map.class == returnType) { |
| | | return Collections.emptyMap(); |
| | | } |
| | | // ææ¶ä¸æ¯æ fluxï¼rxï¼å¼æ¥çï¼è¿åå¼ä¸æ¯ Rï¼ç´æ¥è¿å nullã |
| | | if (R.class != returnType) { |
| | | return null; |
| | | } |
| | | // é FeignException |
| | | if (!(cause instanceof FeignException)) { |
| | | return R.fail(ResultCode.INTERNAL_SERVER_ERROR, errorMessage); |
| | | } |
| | | FeignException exception = (FeignException) cause; |
| | | byte[] content = exception.content(); |
| | | // 妿è¿åçæ°æ®ä¸ºç©º |
| | | if (ObjectUtil.isEmpty(content)) { |
| | | return R.fail(ResultCode.INTERNAL_SERVER_ERROR, errorMessage); |
| | | } |
| | | // è½¬æ¢æ jsonNode 读åï¼å ä¸ºç´æ¥è½¬æ¢ï¼å¯è½ å¯¹æ¹æ¾åçå¹¶ 䏿¯ R çæ ¼å¼ã |
| | | JsonNode resultNode = JsonUtil.readTree(content); |
| | | // 夿æ¯å¦ R æ ¼å¼ è¿åä½ |
| | | if (resultNode.has(CODE)) { |
| | | return JsonUtil.getInstance().convertValue(resultNode, R.class); |
| | | } |
| | | return R.fail(resultNode.toString()); |
| | | } |
| | | |
| | | @Override |
| | | public boolean equals(Object o) { |
| | | if (this == o) { |
| | | return true; |
| | | } |
| | | if (o == null || getClass() != o.getClass()) { |
| | | return false; |
| | | } |
| | | BladeFeignFallback<?> that = (BladeFeignFallback<?>) o; |
| | | return targetType.equals(that.targetType); |
| | | } |
| | | |
| | | @Override |
| | | public int hashCode() { |
| | | return Objects.hash(targetType); |
| | | } |
| | | } |