zoukankan      html  css  js  c++  java
  • springboot使用多个@RestControllerAdvice时的拦截顺序

    修改日志:

      2021-08-27  补充源码说明,增加@Order、@Priority、@Primary 三个注解和 Ordered 接口 说明

    我们的项目中经常会使用到别人的模块,例如我的项目demo,要依赖别人的A模块,以及基础的核心core模块,此时core模块有一个使用了@RestControllerAdvice的类,负责拦截所有的controller异常。

    但是呢,他的异常处理不符合我们demo项目的要求,这就导致我们demo项目要重写自己的controller异常拦截。

    此时我们可以用的解决异常的方法有三种:

    1、使用aop进行切面拦截异常

    2、controller每个方法都用try-catch捕获异常

    3、增加一个@RestControllerAdvice标注的类,负责处理我们项目的controller异常。

    我选用第三种方法,但是当我写了个PartControllerAdvice类,指定basePackages为我自己的项目包,依旧还是被core模块的全局异常处理类拦截了。

    查资料和找博客发现如果有多个加了@RestControllerAdvice的类,他们会依次加载,遇到异常时,按照类加载顺序进行判断,如果前面的类有能处理这个异常的方法,就给前面的类处理。

    我的项目中有两个标注了@RestControllerAdvice的类,core模块的类被先加载,且core模块的异常处理类有个方法专门处理Exception类型的异常,所以我的局部异常处理类始终不执行。

    解决方法:

    @Order(Ordered.HIGHEST_PRECEDENCE)    使用@Order注解,提高自己的局部异常处理类的加载顺序就行了

    代码:

     

     

    模拟效果:

     

    参考文章:https://www.cnblogs.com/code-to-world/p/12779588.html      springboot多个@ControllerAdvice全局异常处理

    源码说明:

     

     

    @Order、@Priority、@Primary 三个注解和 Orderd 接口 说明

    •   orderd接口,实现Oderd接口的话要实现int getOrder();这个方法,返回一个整数值,值越小优先级越高。
    • @Order里面存储了一个值,默认为Integer的最大值,同样值越小优先级越高。要注意@Order只能控制组件的加载顺序,不能控制注入的优先级。但是能控制List 里面存放的XXX的顺序,原因是当通过构造函数或者方法参数注入进某个List时,Spring的DefaultListableBeanFactory类会在注入时调用AnnotationAwareOrderComparator.sort(listA)帮我们去完成根据@Order或者Ordered接口序值排序。@Order更加适用于集合注入的排序。

    • @Priority与@Order类似,@Order是Spring提供的注解,@Priority是JSR 250标准,同样是值越小优先级越高。但是两者还是有一定却别,@Priority能够控制组件的加载顺序,因此@Priority侧重于单个注入的优先级排序。此外@Priority优先级比@Order更高,两者共存时优先加载@Priority。

    • @Primary是优先级最高的,如果同时有@Primary以及其他几个的话,@Primary注解的Bean会优先加载。
  • 相关阅读:
    php 计算两个日期相差天数
    Linux系统查找清理磁盘大文件
    虚拟机重启网络服务失败,当查看状态显示错误Failed to start LSB......
    c++简单编写线性表(实验)
    学校的c++程序课程设计(简单的写法 并无太多c++的特色)
    C语言简单实现链栈基本几个功能
    简单用数组模拟顺序栈(c++)
    详细易懂的二叉树遍历(先中后)
    大数加法之C语言函数法(只有正数版)
    有关Java垃圾回收的几个问题
  • 原文地址:https://www.cnblogs.com/chongcheng/p/13058345.html
Copyright © 2011-2022 走看看