通过配置fallbackFactory来捕获异常信息,代码如下
@FeignClient(name = "user", fallbackFactory = UserFallBackFactory.class)
public interface UserFeign {@PostMapping("/get/list")Map getList();}
@Component
public class UserFallBackFactory implements FallbackFactory<UserFeign> {@Overridepublic UserFeign create(Throwable throwable) {// 捕获具体异常信息String message= FeginUtil.getMessage(throwable);return new UserFeign() {@Overridepublic Map getList() {Map<String, Object> map = new HashMap<>();map.put("status", 500);map.put("message", message);return map;}}}
}
public class FeginUtil {public static String getMessage(Throwable e) {if (e instanceof FeignException) {FeignException feignException = (FeignException) e;String url = feignException.request().url();int status = feignException.status();String message = feignException.getMessage();if (status == 404) {return "服务未找到:" + url;}if (message.contains("Read timed out")) {return "服务处理请求超时:" + url;}if (message.contains("connect timed out")) {return "服务连接超时:" + url;}}if (e instanceof RuntimeException) {RuntimeException runtimeException = (RuntimeException) e;String message = runtimeException.getMessage();if (StringUtils.isNotEmpty(message)) {if (message.contains("Load balancer does not have available server for client")) {String[] split = message.split(":");if (split.length > 2) {return "没有找到可用的服务:" + split[2];}}if(message.contains("[") && message.contains("]")){int startIndex = message.lastIndexOf("[") + 1;int endIndex = message.lastIndexOf("]");String result = message.substring(startIndex, endIndex); JSONObject jsonObject = JSONObject.parseObject(result);return "服务调用异常:" + jsonObject.getString("exception");}}}return "系统异常:" + e.getMessage();}
}