前言
1. @ControllerAdvice详解
ControllerAdvice拆分开来就是Controller Advice,关于Advice,在Spring Aop中,其是用于封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ContrllerAdvice可以理解成是用于对Controller做的一个切面,而具体的业务织入方式则是通过结合其他的注解来实现的。
@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
注解了@Controller的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@ControllerAdvice是在类上声明的注解,其用法主要有三点:
-
结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的;
-
结合方法型注解@InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的;
-
结合方法型注解@ModelAttribute,表示其标注的方法将会在目标Controller方法执行之前执行。
在这里主要分析异常拦截如何处理,首先要明确为什么使用异常拦截?如果没有异常拦截,我们需要写很多try catch finally,这样非业务逻辑的代码就会和业务逻辑代码高度耦合,并且会有很多冗余的代码,所以spring 就有了aop的思想来解决这类问题。
在springBoot中,主要用到注解的方式来处理
- @ExceptionHandler:自定义统一处理某一类异常,从而能够减少代码重复率和复杂度
- @ControllerAdvice:异常统一拦截处理,更好的使业务逻辑与异常处理剥离开
1 自定义异常处理
1.1 定义异常接口
public interface CommonError {
public int getErrorCode();
public String getErrMsg();
public CommonError setErrMsg(String errMsg);
}
1.2 自定义异常类型
public enum EmBusinessError implements CommonError {
//通用错误类型10000开头
PARAMETER_VALIDATION_ERROR(10001,"参数不合法"),
UNKNOWN_ERROR(10002,"未知错误"),
//20000表示用户信息相关错误
USER_NOT_EXIST(20001,"用户不存在"),
USR_LOGIN_FAIL(20002,"用户名或密码错误"),
USR_UNLOGIN(20003,"用户未登录"