Spring Boot @RestControllerAdvice 注解的使用详解
Spring中Aop的使用大家都很清楚,可以通过@Aspect注解进行实现,但是今天这篇文章介绍的是@RestControllerAdvice 注解,这是基于SpringBoot的Aop使用。
1、什么是@RestControllerAdvice
@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
2、@RestControllerAdvice的特点
- 通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
- 注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
- @RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
- @ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
- @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
- @ModelAttribute:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对
3、ControllerAdvice 和 RestControllerAdvice的区别
- @ControllerAdvice 和 @RestControllerAdvice都是对Controller进行增强的,可以全局捕获spring mvc抛的异常。
RestControllerAdvice = ControllerAdvice + ResponseBody
@ControllerAdvice
public class XxxExceptionHandler {
@ExceptionHandler(value = BizException.class)
@ResponseBody
public ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){
logger.error("发生业务异常!原因是:{}",e.getErrorMsg());
return ResultBody.error(e.getErrorCode(),e.getErrorMsg());
}
}
而@RestControllerAdvice只需要在类上引用即可
4、@RestControllerAdvice的使用
/**
* @author: jiangjs
* @description: 统一异常处理方法
* @date: 2022/6/21 11:28
**/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ConstraintViolationException.class, MethodArgumentNotValidException.class})
public ResultUtil<String> resolveViolationException(Exception ex){
StringJoiner messages = new StringJoiner(",");
if (ex instanceof ConstraintViolationException){
Set<ConstraintViolation<?>> violations = ((ConstraintViolationException) ex).getConstraintViolations();
for (ConstraintViolation<?> violation : violations) {
messages.add(violation.getMessage());
}
} else {
List<ObjectError> allErrors = ((MethodArgumentNotValidException) ex).getBindingResult().getAllErrors();
for (ObjectError error : allErrors) {
messages.add(error.getDefaultMessage());
}
}
return ResultUtil.error(400,String.valueOf(messages));
}
}
海纳百川有容乃大

浙公网安备 33010602011771号