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` 接口来实现全局异常处理。