美文网首页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