解决Feign获取异常信息的处理方案
作者:一颗小陨石 发布时间:2023-12-11 13:17:54
标签:Feign,异常信息
Feign获取异常信息
最近在使用Feign调用时,出现了异常,原本使用的是fallback,直接返回了自定义的结果
@Override
public Result findUserNameById(String id) {
return new Result(false, StatusCode.ERROR,"啊哦,用户客户端出现了异常");
}
但是无法获取具体的异常信息
解决方案
将fallback换成fallbackFactory
一、客户端接口指定熔断器处理工厂类
/**
* @author
* @date 2019/9/2215:37
*/
@FeignClient(value = "weblog-article",fallbackFactory = ArticleFallBackFactory.class,configuration = FeignInterceptor.class)
public interface ArticleClient {
/**
* 根据文章id封装搜索文章实体
* @param aid
* @return
*/
@GetMapping("article/client/packageArticle/{aid}")
Result packageArticle(@PathVariable("aid") String aid);
}
二、ArticleFallBackFactory
/**
* @author yunshi
* @date 2019/10/2010:37
*/
@Component
public class ArticleFallBackFactory implements FallbackFactory<ArticleClient> {
@Override
public ArticleClient create(Throwable throwable) {
System.out.println("搜索微服务调用文章客户端出错:"+throwable.getMessage()==null?"":throwable.getMessage());
throwable.printStackTrace();
return new ArticleClientImpl() {
@Override
public Result packageArticle(String aid) {
return new Result(false, StatusCode.ERROR,"搜索微服务调用文章客户端出错 method:packageArticle");
}
};
}
}
有时候throwable的getMessage没有捕获到个别异常信息,干脆就直接打印了堆栈信息
三、ArticleClientImpl
/**
* @author yunshi
* @date 2019/9/2215:41
*/
public interface ArticleClientImpl extends ArticleClient {
}
实操可用~
Feign中 fallback获取400等异常信息及message
Spring cloud中当调用第三接口的时候,为防止超时一直等待,我们一般用断路由的方式来进行超时返回,我一般用Spring Cloud Hystrix。在调用第三方的地方进行fallback进行声明,然后重新fallback函数,配置超时时间,在超时时间内容没有返回或者参数错误就进人到fallback里面进行处理。具体的做法,网上一大堆,可自行百度。
然后第三方接口,在参数错误的时候,也是按400返回,尤其是json里面的数据key对应的value的合法性。而我们出错的时候想把第三参数的错误信息返回,这样就能很明确知道哪错了,而不是认为是超时,下面进入正题:
1.调用第三方的方法
fallbackFactory中调用自己重写的fallback,熔断时会自动调用。
2.fallback函数返回值的组合
自己重写的熔断函数中,重新create函数,其中throwable 会记录捕获的所有异常,我们通过getMessage可得到我们的信息,具体可以参考FallbackFactory接口的实现。
3.返回值
把fallback函数的返回值反倒返回值的msg中返回,这样调用接口的时候就可以得到第三方返回的错误信息,进行调整了。
来源:https://blog.csdn.net/weixin_43696529/article/details/102648333


猜你喜欢
- 背景:最近需要做一个任务:C# PDF文件需要传输为JPG图片。一开始没有头绪,最后去github找到了现在我用的PdfiumViewer组
- //哈弗曼编码的实现类public class HffmanCoding { private int c
- Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使
- 这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存,具体内容如下首先是页面html的 我这是提交一
- 第一种:(调用系统API)首先引入两个命名空间using System.Runtime.InteropServices;using Syst
- 本文以一个asp.net程序为例讲述了Repeater中添加按钮实现点击按钮获取某一行数据的方法,分享给大家供大家参考借鉴之用。具体步骤如下
- 使用了Android的系统API实现了多点触控功能,多点触控对设备的硬件有一定的要求,目前市面上的手机几乎都能实现多点触控了。实现多点触控最
- 1、final修饰类被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现
- springboot启动是通过一个main方法启动的,代码如下@SpringBootApplicationpublic class Appl
- mybatis中的#和$的区别1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#
- ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序每一个应用程序都会运行在它独立的进程里,
- 安卓开发网络请求可谓是安卓开发的灵魂,如果你不会网络请求,那么你开发的应用软件就是一具没有灵魂的枯骨。在安卓开发中进行网络请求和java中的
- 公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉
- 最近面试时,面试官问了一个列表倒计时效果如何实现,现在记录一下。运行效果图实现思路实现方法主要有两个:1.为每个开始倒计时的item启动一个
- log4j配置失效日志中打印Debug信息最近发布项目的时候发现控制台打印的日志较往常多了很多,仔细一看,debug和info信息也赫然在列
- Java在控制台打印本月日历在学习《Java核心技术卷I·基础知识》第10版 的时候里面有一个小例子,就是在控制台上打印日历的一个例子,就想
- 官方文档 8.0Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码会对使用以及原理做一些学习笔记。1.简介
- 目录为什么要使用 TaskTask 和 Thread 区别Task 介绍Task 简单实现Task 执行状态1.等待(Wait)2. 返回值
- springboot部署项目在linux的两种方式 可以选择 war包方式或者jar包方式(个人推荐使用jar方式)1.springboot
- 使用maven引入jar<dependency> <groupId>com.itextpdf</g