当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- Test Cases: Four-Step Test Design Approach
- 期货开户调整交易所保证金标准
- 管理基础知识16
- IDEA版Postman插件Restful Fast Request,细节到位,功能好用
- Multidimensional Correlation Time Series Modeling Method Based on Screening Partial Least Squares Regression of Correlation Variables
- 渗透测试与攻防对抗——渗透测试基础
- c语言字符和字符串函数总结(二)
- Routing strategy
- 网络请求技术--跨域
- 146. LRU cache
猜你喜欢
渗透测试与攻防对抗——渗透测试基础
期货开户如何确定期货公司正规性?
DFS详解
Realize deletion - a specified letter in a string, such as: the string "abcd", delete the "a" letter in it, the remaining "bcd", you can also pass multiple characters to be deleted, and pass "ab" can
Test Cases: Four-Step Test Design Approach
datax与datax-web安装部署
傅立叶变换相关公式
C语言函数详解(1)【库函数与自定义函数】
NFT到底有哪些实际用途?
网络请求技术--跨域
随机推荐
什么是低代码(Low-Code)?低代码适用于哪些场景?
网络请求技术--跨域
管理基础知识9
DFS详解
Unknown CMake command "add_action_files"
Redis的集群模式
Redis - message publish and subscribe
Redis和MySQL数据一致性问题,有没有好的解决方案?
管理基础知识18
期货开户如何确定期货公司正规性?
辨析内存函数memset、memcmp、memmove以及memcpy
这 4 款电脑记事本软件,得试试
MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界
Active Disturbance Rejection Control of Substation Inspection Robot Based on Data Drive
管理基础知识14
GO GOPROXY代理设置
【CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)(A~D)】
What is Low-Code?What scenarios is low code suitable for?
H5页面调用微信授权获取code
poker question