在上一篇文章中,我们使用了统一响应格式,这保证了我们在经过正常的控制器处理流程后,都能返回统一的数据格式,这为开发带来了便利。但这还不够,一个web程序几乎不可避免地要处理各种异常,最基本的,比如数据校验。在发生了异常后,我们希望response数据响应格式依然不变。
为此,我们使用spring提供的@ControllerAdvice
配合 @ExceptionHandler
实现全局异常处理(当然由于我们统一返回的数据都是json,所以直接用@RestControllerAdvice即可)
代码
@ExceptionHandler注解源码如下,我们可以看到这里用了泛型的上界通配符,可以接收任何Throwable的子类或者自己本身
public @interface ExceptionHandler {
java.lang.Class<? extends java.lang.Throwable>[] value() default {};
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(SystemException.class)
public ResponseResult systemExceptionHandler(SystemException e){
return ResponseResult.errorResult(e.getCode(),e.getMsg());
}
}
在这里我们定义了自己的异常类型SystemException(继承RuntimeException),于是我们能够将数据响应都以相同格式返回了。同时,我们希望code,message这些信息都是我们前文所讲的自定义枚举类里的(于是我们要修改返回的错误提示等,只要在枚举类中修改即可),于是有如下代码
public class SystemException extends RuntimeException{
private int code;
private String msg;
内含两个私有变量
public SystemException(AppHttpCodeEnum httpCodeEnum) {
super(httpCodeEnum.getMsg());
this.code = httpCodeEnum.getCode();
this.msg = httpCodeEnum.getMsg();
}
支持用我们之前定义的枚举类为构造函数的参数。