美文网首页Java开发
Spring Boot 使用 @ControllerAdvice

Spring Boot 使用 @ControllerAdvice

作者: _浅墨_ | 来源:发表于2022-10-11 14:35 被阅读0次

    在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中

    此注解是一个增强的 Controller。使用这个 Controller 可实现三个方面的功能:

    1. 全局异常处理 (@ExceptionHandler)
      用于捕获Controller中抛出的不同类型的异常
    2. 全局数据绑定 (@InitBinder)
      用于请求中注册自定义参数的解析
    3. 全局数据预处理 (@ModelAttribute)
      此方法会在执行目标Controller方法之前执行

    一个示例:

    /**
     * ControllerAdvice本质上是一个Component,因此也会被当成组建扫描
     * ControllerAdvice 提供了多种指定Advice规则的定义方式,默认什么都不写,则是Advice所有Controller,当然你也可以通过下列的方式指定规则
     * 比如对于 String[] value() default {} , 写成@ControllerAdvice("org.my.pkg") 或者 @ControllerAdvice(basePackages="org.my.pkg"), 则匹配org.my.pkg包及其子包下的所有Controller,当然也可以用数组的形式指定,如:@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"}), 也可以通过指定注解来匹配,比如我自定了一个 @CustomAnnotation 注解,我想匹配所有被这个注解修饰的 Controller, 可以这么写:@ControllerAdvice(annotations={CustomAnnotation.class})
     *
     **/
    @ControllerAdvice
    public class ControllerExceptionHandler {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    
        /**
         * @description 异常处理 handler
         * @param request request
         * @param e 异常
         * @author chang
         * @date 2022/10/11 2:10 PM
         * @return
         **/
        @ExceptionHandler(Exception.class)
        public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
            logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);
    
            /*
             * 这里 Exception.class 标注为拦截所有异常,只是如果有使用 ResponseStatus 注解的方法抛出的异常
             * 不进行跳转到错误页面,而是直接抛出异常
             */
            if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
                throw e;
            }
    
            ModelAndView mv = new ModelAndView();
            mv.addObject("url",request.getRequestURL());
            mv.addObject("exception", e);
            mv.setViewName("error/error");
            return mv;
        }
    }
    
    

    参考:

    1. 精通Spring Boot —— 第十五篇:使用@ControllerAdvice处理异常

    相关文章

      网友评论

        本文标题:Spring Boot 使用 @ControllerAdvice

        本文链接:https://www.haomeiwen.com/subject/lkxzartx.html