springboot@ExceptionHandler,@RestControllerAdvice

@RestControllerAdvice

@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。

@RestControllerAdvice的特点:

1.通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
2.注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
3.@RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
4.@ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
5.@InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
6.@ModelAttribute:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping

1
2
3
4
5
6
7
8
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler
public Result hasException(Exception e){
e.printStackTrace();
return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败!");
}
}

@ExceptionHandler

和@RestControllerAdvice配合使用,当我们使用这个@ExceptionHandler注解时,我们需要定义一个异常的处理方法,给这个方法加上@ExceptionHandler注解,这个方法就会处理类中其他方法(被@RequestMapping注解)抛出的异常。

2,注解的参数

@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常,比如这样:

1
2
3
4
5
6
7
@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {
System.out.println("抛异常了:" + ex);
ex.printStackTrace();
String resultStr = "异常:NumberFormatException";
return resultStr;
}

此时注解的参数是NumberFormatException.class,表示只有方法抛出NumberFormatException时,才会调用该方法。