接上一篇,我们已经做了参数校验之后,当我们传入了错误的参数,系统会自动进行校验并报出错误,
但是,这个错误的格式有些繁琐,并且会暴露后端系统的信息,所以我们需要对这样的错误进行统一的拦截并返回一个统一的格式方便前端进行处理,我们首先来定义一下统一返回的信息有那些:
当发生错误的时候,我们首先要给前端一个错误码,方便前端来进行判断是什么错误,其次我们还需要一个错误的消息来阐述这是个什么错误,那么我们的返回格式就是:
{
"code" : 0, // 状态码
"msg":"错误信息"
}
其次如果请求成功了,我们也要返回前端需要的数据信息,那么我们在此基础上加入data:
{
"code" : 0, // 状态码
"msg":"错误信息",
"data":Object
}
好了,返回的数据格式定义好了,我们就来创建实体类Result:
public class Result<T> {
private int code;
private String msg;
private T data;
/**
* 成功时候的调用
* */
public static <T> Result<T> success(T data){
return new Result<T>(data);
}
/**
* 失败时候的调用
* */
public static <T> Result<T> error(CodeMsg cm){
return new Result<T>(cm);
}
private Result(T data) {
this.code = 0;
this.msg = "success";
this.data = data;
}
private Result(CodeMsg cm) {
if(cm == null) {
return;
}
this.code = cm.getCode();
this.msg = cm.getMsg();
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
}
public class CodeMsg {
private int code;
private String msg;
public static CodeMsg SUCCESS = new CodeMsg(0,"success");
public static CodeMsg SEVER_ERROR = new CodeMsg(50010,"服务器端异常");
public static CodeMsg BIND_ERROR = new CodeMsg(50011,"参数错误:%s");
public CodeMsg(int code,String msg){
this.code = code;
this.msg = msg;
}
public CodeMsg fillArgs(Object ... objects){
int code = this.code;
String msg = String.format(this.msg,objects);
return new CodeMsg(code,msg);
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
好了,接下来我们每次向外返回信息,就可以使用Result来进行返回
接下来,我们要对异常进行一个拦截,新建一个GlobalExcptionHandler
,在类上边加入@ControllerAdvice
来实现异常的拦截,同时因为我们向外输出的信息是JSON的,因此我们加入一个@ResponseBody
来输出JSON信息
新建方法 exceptionHandler
,使用 @ExceptionHandler(value = Excption.class)
来表示我们要拦截的是那种异常,我们在这里就拦截所有的异常,系统会自动为我们传入Exception这个参数来供我们进行操作
我们的参数校验异常通过看错误信息得知,为org.springframework.validation.BindException
因此我们对这个异常进行特殊处理
//如果是绑定异常
if(e instanceof BindException){
BindException exception = (BindException) e;
List<ObjectError> errors = exception.getAllErrors();
ObjectError error = errors.get(0);
String message = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(message));
}else{
//其他异常统一处理
return Result.error(CodeMsg.SEVER_ERROR);
}
这样,我们就实现了异常的拦截,GlobalExcptionHandler的全部代码如下:
@ControllerAdvice
@ResponseBody
public class GlobalExcptionHandler {
@ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(Exception e){
//如果是绑定异常
if(e instanceof BindException){
BindException exception = (BindException) e;
List<ObjectError> errors = exception.getAllErrors();
ObjectError error = errors.get(0);
String message = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(message));
}else{
//其他异常统一处理
return Result.error(CodeMsg.SEVER_ERROR);
}
}
}
接下来启动服务器,进行测试
成功,撒花~