相关文章推荐
潇洒的茶壶  ·  如何将数据导出到 Excel·  1 年前    · 
威武的蘑菇  ·  IBM Cloud Docs·  2 年前    · 

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

一、场景假设我有2个服务:xxx-common 和 xxx-auth ,3个异常处理器。目录结构如下:xxx-common 公共类存放的jar包 自定义的 ApiExceptionHandler 类 有2个异常处理器,分别是: ① ApiException.class 和 ...
SpringBoot-Shiro权限控制(2019.12.13) 在《Spring-Boot-shiro用户认证》中,我们通过继承AuthorizingRealm抽象实现了doGetAuthenticationInfo()方法完成了用户认证操作。接下来继续实现doGetAuthorizationInfo()方法完成Shiro的权限控制功能。 授权也称为访问控制,是管理资源访问的过程。即根据不同用...
在靠谱点的就是建立一个BaseException,其他的自定义异常都继承这个class,这样做的好处是在处理异常时给我提供了很多便利。 今天我要说的是把异常和枚举结合起来用,我当前自己的项目中就是这么使用的,啥也不说了上代码: BaseException(限于篇幅部分代码删除了): publicclassBaseExcept... @RestControllerAdvice public class AppExceptionHandler { private Logger logger = LoggerFactory.getLogger(getClass()); * 处理自定义异常 * AppException 自定义 运行时异常 * ResultInfo 自定义统一返回,用户前后端分离 @Exce 2个服务:A-common 和 BService,各自有异常处理器。 其中A中定义了通用的异常处理器,供所有服务直接调用。 但是B服务由于业务需求需要处理一些A中没有的异常,由于A中存在兜底逻辑:对Exception进行捕获,这个时候就要指定异常处理器的执行顺序。 Spring的异常处理器是根据异常处理器被加载的顺序来顺序执行,比如:A->B->C ,如果B拦截并且处理了某个异常,就会直接抛出,C的异常处理器就执行不到了。 可以通过 @Order 注解来
六、SpringBoot异常 SpringBoot 框架异常处理有五种处理方式,从范围来说包括有全局异常捕获处理方式和局部异常捕获处理方式,接下来通过使用下面的后端代码一一对这五种捕获方式讲解。 一.默认异常处理界面和自定义异常界面 二. @ExceptionHandler 注解处理局部异常 三. @ControllerAdvice + @ExceptionHandler 注解处理全局异常 四. SimpleMappingExceptionResolver 处理异常 五.HandlerExceptionR
@Order(1) public class AuthorizationEndpointAdvice { // 切入点为AuthorizationEndpoint里面的三个handleException方法 @Pointcut("execution(public * org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint.handle*Exception(..).. @ExceptionHandler:用于在特定处理程序和/或处理程序方法中处理异常的注释。 使用该注释注释的处理程序方法允许具有非常灵活的签名。它们可以有下列型的参数,按任意顺序排列: 1.异常参数:声明为一般异常或更具体的异常。若要声明更为具体得参数,可用value来确定 2.请求和/或响应对象(通常来自Servlet API),可以选择任何特定的请求/响应型:如 javax.servlet.http.HttpServletRe 在上一篇《Shiro – 登陆验证》中我们在自定义的UserRealm中继承了抽象AuthorizingRealm,实现该中的doGetAuthenticationInfo方法完成了登陆验证功能的实现。这次我们继续实现另一个方法doGetAuthorizationInfo()来实现权限控制功能。 授权也称为访问控制,是管理资源访问的过程。即根据不同用户的权限判断其是否有访问相应资源的权限... public class ResultCode extends HashMap<String, Object> { private static final long serialVersionUID = 1L; public ResultCode() { put("code",
要在 Spring Boot 中实现全局异常处理,你可以这样做: 1. 定义一个异常处理,并实现 Spring 的 `HandlerExceptionResolver` 接口或者使用 `@ControllerAdvice` 和 `@ExceptionHandler` 注解。 2. 在你的异常处理中,通过使用 `@ExceptionHandler` 注解来声明你要处理的异常型。 例如,假设你要处理所有型的异常,你可以这样写: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { // 处理异常并返回响应 ErrorResponse error = new ErrorResponse(); error.setMessage(ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); 在这个例子中,我们通过使用 `@ControllerAdvice` 注解声明了这个是一个全局异常处理,并使用 `@ExceptionHandler` 注解声明了要处理的异常型是 `Exception`。你也可以声明多个 `@ExceptionHandler` 注解来处理不同型的异常。 然后,你可以在你的应用程序中抛出异常,Spring 会自动调用你定义的异常处理方法来处理异常。 注意:如果你使用的是 Spring Boot 2.x 版本,你可以通过实现 `ErrorController` 接口来实现全局异常处理。