关键操作

实现ErrorDecoder接口

问题和背景

最近项目中在大量使用Feign和OkHttp作为http客户端使用,开发效率得到显著的提升。但也面临一些问题,比如每个下游系统的异常返回方式不同,需要编写大量的错误处理代码来适应不同的服务,而且错误处理代码混在业务代码中,违反单一职责原则和最少知识原则。面临着维护难度上升的风险。需要一个方案来规避这些后期维护成本上升的风险。

目的

防止项目腐化,避免错误处理代码与业务代码强耦合。导致后期的维护成本的上升和陷入逻辑迷宫的风险。保证灵活性和高可维护性

手段

拆分错误处理代码和业务逻辑代码。由于使用的是 Feign和OkHttp作为客户端,而企业场景下的开发通常有统一Trac请求的需求。首先想到的是客户端的请求和响应的拦截器实现。

实施

查询Feign的资料后发现Feign有 ErrorDecoder 接口。资料点这里

那我们只要实现Feign的 ErrorDecoder 的接口就可以实现 http请求层面的错误处理。

官方示例

public class StashErrorDecoder implements ErrorDecoder {

    @Override
public Exception decode(String methodKey, Response response) {
if (response.status() >= 400 && response.status() <= 499) {
return new StashClientException(
response.status(),
response.reason()
);
}
if (response.status() >= 500 && response.status() <= 599) {
return new StashServerException(
response.status(),
response.reason()
);
}
return errorStatus(methodKey, response);
}
}

解读

StashErrorDecoder类实现了ErrorDecoder接口。在Feign客户端发生http请求层面的错误时会调用decode方法。在decode方法中实现自定义的错误处理。

使用

接下来就需要注册这个错误拦截器了,如果是直接手动构建FeignClient的使用方法。那需要在构建客户端时指定errorDecoder

return Feign.builder()
.errorDecoder(new StashErrorDecoder())
.target(StashApi.class, url);

如果是使用了spring-cloud-open-feign的使用方式,包含了启动的自动配置,所以只需要将错误处理类注册为配置类,即添加@Configuration注解即可。

@Configuration
public class StashErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
// 实现代码
}
}

Feign实现自定义错误处理的更多相关文章

  1. Spring Cloud Feign+Hystrix自定义异常处理

    开启Hystrix spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启. feign.hystrix.enabl ...

  2. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  3. ASP.NET Core中显示自定义错误页面

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  4. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

    应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...

  5. MVC4 自定义错误页面(转)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

  6. haproxy实现自定义错误页面的内容

    现在利用haproxy实现自定义的haproxy的错误页面 我们现在实现自定义错误页面有以下的方法: 一种是自定义错误页面 haproxy.conf defaults errorfile 404 /e ...

  7. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  8. ASP.NETMVC自定义错误页面真的简单吗?

    Note:文章前半部分翻译自 http://benfoster.io/blog/aspnet-mvc-custom-error-pages ,着急的可直接看总结~ 如果你在设置asp.net mvc自 ...

  9. ASP.NET中处理自定义错误的最佳方式

    要在ASP.NET中处理好自定义错误(Custom Errors)首先要抛弃使用web.config\customErrors. <customErrors mode="RemoteO ...

随机推荐

  1. make CMake 来龙去脉

    理论上说,任意一个C++程序都可以用g++来编译. 大家都知道,写程序大体步骤如下: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执 ...

  2. Android Okhttp POST提交键值对

    以前的项目网络连接那块一直坚持使用HttpClient,总是会出现一些莫名奇妙的问题,现在新的项目使用了OKHttp网络框架,发现超级好用,上网再了解下,发现OkHttp口碑真的不错,对比之下Http ...

  3. SPring boot jpa 封装查询条件

    最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...

  4. springboot日常问题处理手记

    springboot启动问题 1.@Autowired报错Could not autowire. No beans of xxx 解决:只需在DAO接口加上@Component 或者 @Reposit ...

  5. C++对c中函数的拓展,函数重载

    函数参数的拓展 inline内联函数 最好 小的函数都写成内联函数, 写上inline 编译器不一定内联, C++中推荐使用内联函数替代宏代码片段 C++中使用inline关键字声明内联函数 内联函数 ...

  6. oarcle wm_concat 值过长解决--使用 clob

    sql 语句替换 :select XMLAGG(XMLELEMENT(a, WSODETAILPALINCD || ',')).EXTRACT('//text()').getclobval() as ...

  7. Spring Data Elasticsearch 聚合查询

    如需要统计某件商品的数量,最高价格,最低价格等就用到了聚合查询,就像数据库中的group by 首先需要注入ElasticsearchTemplate @Autowired private Elast ...

  8. python windows下获取路径时有中文处理

    在windows中用os,path.abspath(__file__)时有中文路径时,默认是转成非unicode格式 这会导致,在其它模块使用该路径时,会报 utf8' codec can't dec ...

  9. python--线程知识详解

    Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1.1.threading模块 threading模块建立在_thread模块之上.thread模块以低级=原始的方式来处理 ...

  10. LeetCode 1123. Lowest Common Ancestor of Deepest Leaves

    原题链接在这里:https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/ 题目: Given a rooted b ...