当前位置:网站首页>feign异常传递的两种方式 fallbackfactory和全局处理 获取服务端自定义异常
feign异常传递的两种方式 fallbackfactory和全局处理 获取服务端自定义异常
2022-08-02 00:19:00 【m0_67392409】
一般我们在用feign调用接口的时候,如果服务提供方出现了异常,那么调用方一般会显示
feign.FeignException$BadRequest: status 400 reading
不考虑服务方宕机的情况,一般有异常都会抛出对应的信息,但是一般情况调用方是无法获取的。通过测试我们发现,如果打印日志的话,是可以看到服务提供方抛出的日志,但是调用方捕获不了,只会报400异常。
所以如果要进行异常传递,我们可以有两种方式,但大部分是需要调用方做调整。
一、fallbackFactory
fallbackFactory就和标准的熔断降级差不多,可以把异常信息全部带过来,但是需要我们对异常做转换,常规的exception还是无法获取body部分的。所以这里我们用FeignException强转,问题就迎刃而解了。
看,我们可以获取到服务端抛出的自定义错误了。
这时候再把json转bean就可以了。
参考:
服务端和客户端共同
@FeignClient(value = "sq-service", path = "/service",url = "http://localhost:9980", fallbackFactory = TestFactory.class)
public interface TestApi {
@PostMapping("/test")
String test();
}
@Component
public class TestFactory implements FallbackFactory<TestApi> {
@Override
public TestApi create(final Throwable throwable) {
FeignException ex = (FeignException) throwable;
JSONObject jsonObject = JSONObject.parseObject(ex.contentUTF8());
return new TestApi() {
@Override
public String test() {
return jsonObject.getString("message");
}
};
}
}
注意!客户端要熔断降级必须在yaml文件里进行配置:
客户端:
feign:
hystrix:
enabled: true
否则无法进入fallbackFactory
二、一劳永逸,全局配置
我直接一个config文件解决!
比起fallbackFactory,不需要共同代码,不需要熔断降级,服务端不需要做任何改动,只需要客户端配置就行。能不改服务端就尽量别动,不然真就,想diss了。
客户端
@Configuration
public class FeignErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(final String methodKey, final Response response) {
try {
String message = Util.toString(response.body().asReader());
try {
JSONObject jsonObject = JSONObject.parseObject(message);
// 包装成自己自定义的异常,这里建议根据自己的代码改
return new MyException(jsonObject.getString("message"), jsonObject.getInteger("code"));
} catch (JSONException e) {
e.printStackTrace();
}
} catch (IOException ignored) {
}
return decode(methodKey, response);
}
}
可以看到,这种方式可以直接反馈到调用方,也就是说,前端调用都能直接显示在web页面上了。可以说是很直接的告诉你异常了。
feign的异常传递就这么简单,一般来说项目都有自己的自定义异常全局类,仅供参考。
强烈建议全局处理!!!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
随机推荐
BGP first experiment
go笔记记录——channel
微信支付软件架构,这也太牛逼了!
datax与datax-web安装部署
请教一下本网站左下角的动漫人物是怎么做的?
Day.js 常用方法
H5画布 canvas(一)canvas简介、绘制圆形矩形、案例饼状图绘制
不要用jOOQ串联字符串
dayjs时间处理库的基本使用
期货开户是否有资金门槛?
2022/08/01 Study Notes (day21) Generics and Enums
dbeaver连接MySQL数据库及错误Connection refusedconnect处理
Knowing the inorder traversal of the array and the preorder traversal of the array, return the postorder history array
青蛙跳台阶
IDEA找不到Database解决方法
JS中的防抖和节流
实现删除-一个字符串中的指定字母,如:字符串“abcd”,删除其中的”a”字母,剩余”bcd”,也可以传递多个需要删除的字符,传递”ab”也可以做到删除”ab”,剩余”cd”。
Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列)
DCM 中间件家族迎来新成员
js中内存泄漏的几种情况