多个服务间多个自定义的ExceptionHandler类的执行顺序
一、场景
假设我有2个服务:xxx-common 和 xxx-auth ,3个异常处理器。
目录结构如下:
xxx-common 公共类存放的jar包
自定义的 ApiExceptionHandler 类 有2个异常处理器,分别是:
① ApiException.class 和
② Exception.class
xxx-auth Shiro授权认证的jar包
自定义的 AuthorizationExceptionHandler 类 只有1个异常处理器:
③ AuthorizationException.class
二、问题
那么,在我A服务引入这两个包的同时,如果我报的是 AuthorizationException 异常,有可能会先走 xxx-common 包下的
ApiExceptionHandler 类 中的 ② Exception.class 异常处理器,这并不是我想要的结果。
三、解决办法
通过源码可以知道Spring的异常处理器是根据异常处理器被加载的顺序来顺序执行,
比如:A->B->C ,那么如果B符合抛出异常的条件,就会直接抛出,然而我们真正需要被执行的C可能就执行不到了。
此时,可以通过 @Order 注解来指定实体Bean被加载到Spring容器的顺序,注解中的值越小越优先加载。
@Order(1)//指定该实体bean被加载的顺序,注解中的值越小越优先被加载注入。
@RestControllerAdvice
public class AuthorizationExceptionHandler {@ExceptionHandler(AuthorizationException.class)public Code handleAuthorizationException(AuthorizationException e) {log.error("没有权限的异常信息:", e);return Code.NOT_PERMISSION.setErrCode(new Code().setMsg(e.getMessage()));}}
四、结论
其实,多个服务间多个自定义的ExceptionHandler类的执行顺序就是被Spring加载到容器中Bean加载顺序。
五、另外
在同一个自定义的ExceptionHandler类,定义多个异常处理器,他们的加载顺序如何决定?
结论:是由 ExceptionHandlerMethodResolver 通过递归查找调用链,内部自己判断决定的。调用链越小,执行度越高。
详情请看此链接:(转载)https://juejin.im/post/5d022d50f265da1bb564f374
多个服务间多个自定义的ExceptionHandler类的执行顺序相关推荐
- gRPC-微服务间通信实践
微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) 场景:A服务主动发起 ...
- .NET Core使用gRPC打造服务间通信基础设施
一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...
- 怎么看调用的接口_SpringCloud服务间调用
本篇简介 在上一篇我们介绍了SpringCloud中的注册中心组件Eureka.Eureka的作用是做服务注册与发现的,目的是让不同的服务与服务之间都可以通过注册中心进行间接关联,并且可以通过注册中心 ...
- 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!
在微服务项目中,如果我们想实现服务间调用,一般会选择Feign.之前介绍过一款HTTP客户端工具Retrofit,配合SpringBoot非常好用!其实Retrofit不仅支持普通的HTTP调用,还能 ...
- 如何缩小安全漏洞爆炸半径,实现服务间零信任安全?
作者:王夕宁, 奇方 近日国内外多家安全机构监测到 Apache Log4j 存在任意代码执行漏洞(漏洞编号:CVE-2021-44228),未取得身份认证的用户,可以从远程发送数据请求输入数据日志, ...
- Spring Boot微服务间文件返回实现
Feign接口获取文件流问题_Java_wyazyf的博客-CSDN博客 https://blog.csdn.net/wyazyf/article/details/93200033 Spring Bo ...
- Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
上一讲我们学习了 Ribbon 与 RestTemplate 两个组件.Ribbon 提供了客户端负载均衡,而 RestTemplate 则封装了 HTTP 的通讯,简化了发送请求的过程.两者相辅相成 ...
- SpringCloud采坑之Feign服务间调用默认返回xml
2019独角兽企业重金招聘Python工程师标准>>> 日前在使用SpringCloud的时候,需要用到服务间的调用,采用Feign进行调用,但是默认返回了xml格式的数据,比较坑爹 ...
- Istio:一个用于微服务间通信的服务网格开源项目
http://www.infoq.com/cn/news/2017/05/istio Istio:一个用于微服务间通信的服务网格开源项目 Google.IBM和Lyft开源了微服务管理.保护和监控框架 ...
最新文章
- 【干货】史上最全的Tensorflow学习资源汇总,速藏!
- pythonapp下载-python编程狮app下载
- php中浮点型的精确度,PHP中的浮点精度和类型
- 腾讯云服务器 - 定时备份MariaDB/MySQL
- 数据挖掘-二手车价格预测 Task02:数据分析
- 软件工程项目之Windows Phone Application的一个设想
- input标签上传文件(一篇搞定)
- html中的字体怎么选择,网页开发中如何选取合适且统一的字体
- IM 产品设计思考(4)- 问答机器人
- java:找不到符号
- 腾讯的星星海服务器芯片,腾讯云星星海重磅发布两款自研新品 打造软硬一体云计算基础设施...
- mace micro 代码分析: netdef 和Graph文件的生成
- 首台android手机号码,国内首批手机Android 12尝鲜列表已公布,华为与荣耀不在名单之上...
- 微信小程序 ---在Vscode上编辑,微信开发者工具上预览,快速上手
- 毕设第三周(12月19日——12月25日)
- 你好,法语!A2课文汇总
- 面试专家职位面试官会问什么
- 洗稿,技术上怎么判断文章相似性?
- android 监听来电去电,Android监听来电和去电的实现方法
- 案例5:Java大学生创新创业项目管理设计与实现任务书