Spring Boot @RestControllerAdvice 注解的使用详解

Spring中Aop的使用大家都很清楚,可以通过@Aspect注解进行实现,但是今天这篇文章介绍的是@RestControllerAdvice 注解,这是基于SpringBoot的Aop使用。

1、什么是@RestControllerAdvice

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

2、@RestControllerAdvice的特点

  1. 通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
  2. 注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
  3. @RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
  4. @ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
  5. @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
  6. @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));
    }
}
posted @ 2023-06-27 13:55  YYNo1  阅读(1070)  评论(0)    收藏  举报