SpringMVC 统一异常处理
2021-12-29 本文已影响0人
想象之中丶意料之外
- 通过 @RestControllerAdvice + @ExceptionHandler 注解完成 统一异常处理,并使用JSON格式返回异常信息
- 如果不需要使用JSON格式返回,可以使用 @ControllerAdvice + @ExceptionHandler完成,对应的增强方法中,可以使用ModelAndView来完成异常页面返回。
- 或者使用 HandlerExceptionResolver异常处理器方案,直接往 response 中写返回数据,或者直接 网页重定向到指定页面。
实现步骤
- 定义自定义业务异常类(即:友好提示异常。比如:用户名必填、密码规则校验这类友好提示)
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;
}
}
-
使用@RestControllerAdvice注解,完成对所有Controller类的功能增强(@RestControllerAdvice注解:@ControllerAdvice + @ResponseBody注解(@ResponseBody详解)的结合。其实就是:设置所有Controller类增强功能,且增强方法的返回值是Json格式)
-
使用@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中测试通过