美文网首页Java学习笔记
SpringMVC 统一异常处理

SpringMVC 统一异常处理

作者: 想象之中丶意料之外 | 来源:发表于2021-12-29 17:48 被阅读0次
    • 通过 @RestControllerAdvice + @ExceptionHandler 注解完成 统一异常处理,并使用JSON格式返回异常信息
    • 如果不需要使用JSON格式返回,可以使用 @ControllerAdvice + @ExceptionHandler完成,对应的增强方法中,可以使用ModelAndView来完成异常页面返回。
    • 或者使用 HandlerExceptionResolver异常处理器方案,直接往 response 中写返回数据,或者直接 网页重定向到指定页面。

    实现步骤

    1. 定义自定义业务异常类(即:友好提示异常。比如:用户名必填、密码规则校验这类友好提示)
     public class BusinessException extends RuntimeException {
        private String message;
        private int code;
    
        public BusinessException(int code, String message) {
            super(message);
            this.message = message;
            this.code = code;
        }
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public int getCode() {
            return code;
        }
    }
    
    1. 使用@RestControllerAdvice注解,完成对所有Controller类的功能增强(@RestControllerAdvice注解:@ControllerAdvice + @ResponseBody注解(@ResponseBody详解)的结合。其实就是:设置所有Controller类增强功能,且增强方法的返回值是Json格式)

    2. 使用@ExceptionHandler注解,完成接收所有Controller类抛出的所有异常(如果需要接收指定异常,则在@ExceptionHandler中设置即可。看:Spring的@ExceptionHandler注解使用方法

    /**
     * 通过 @RestControllerAdvice 注解,来完成 @ControllerAdvice + @ResponseBody注解功能
     * 此 异常会抛出一个 JSON格式的 异常字符串
     */
    @RestControllerAdvice
    public class AllExceptionAdvice {
    
        /**
         * 使用 @ExceptionHandler注解来 拦截所有Controller抛出的异常。
         * 注解中没有指定 任何 需要拦截的异常,故会拦截所有异常。
         * 再判断,如果是自定义异常的业务异常(BusinessException)。则直接抛出对应的 code & 错误信息。
         * 否则,认为是系统异常,则抛出统一错误码501,并显示错误信息。
         */
        @ExceptionHandler
        public JsonReturn allExceptionAdvice(Exception e) {
            JsonReturn jsonReturn = new JsonReturn();
            if (e instanceof BusinessException) {
                BusinessException re = (BusinessException) e;
                jsonReturn.setCode(re.getCode());
                jsonReturn.setMsg(re.getMessage());
            } else {
                jsonReturn.setMsg(e.getMessage());
                jsonReturn.setCode(501);
            }
            return jsonReturn;
        }
    }
    

    补充说明

    • @ControllerAdvice 和 @RestControllerAdvice注解是支持参数,比如:basePackages(设置的包和子包的Controller方法才会被增强)、annotations(同理,只有这个Controller方法上有指定的注解才会被增强)。
    • 同理,不仅可以统一返回JSON格式数据,还可以使用ModelAndView来统一返回500页面。

    • 以上,在 spring-webmvc 5.2.18.RELEASE中测试通过

    相关文章

      网友评论

        本文标题:SpringMVC 统一异常处理

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