@ControllerAdvice和、@ExceptionHandler可以构建全局异常处理器。
它们的底层原理是使用Spring AOP方式对被@RequestMaping声明的方法进行增强,从而达到异常统一处理的目的。
这样做的好处的就是不需要我们手动的对每一个异常进行try…catch。
首先@ControllerAdvice相当于通知类,同时又要具备切点表达式的身份,它会对所有被@RequestMaping声明的方法进行增强。
而@ExceptionHandler声明的方法相当于通知(增强方法)但它更加强大,它会对切入点进行上下文检索其声明的异常(@ExceptionHandler(value = Exception.class))所在,进行try…catch统一对异常进行处理。
全局异常处理流程:
1、创建自定义业务异常类;
2、创建一个类并声明@ControllerAdvice,作为全局异常处理类
3、在全局异常处理类上,创建增强方法,声明@ExceptionHandler检索需要处理的异常。
自定业务义异常类:
/**
* 自定义业务异常类
*/
public class CustomException extends Exception {
public CustomException(String message){
//抛出異常時自定義異常信息替代RuntimeException提供的message
super(message);
}
}
全局异常处理类:
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
@ResponseBody
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
String message = ex.getMessage();
if (message.contains