一般会定义一个统一的返回格式,如下
public class Result<T> {
/**
* 错误码
*/
private Integer code;
/**
* 错误信息
*/
private String msg;
/**
* 成功内容
*/
private T data;
private Result(T data) {
this.code = 0;
this.msg = "success";
this.data = data;
}
private Result(CodeMsg codeMsg) {
if(codeMsg == null){
return;
}
this.code = codeMsg.getCode();
this.msg = codeMsg.getMsg();
}
//数据反馈成功时候调用,只需要传入成功信息data
public static <T> Result<T> success(T data) {
return new Result(data);
}
//数据反馈失败时候调用,需要传入错误信息msg和错误码code
public static <T> Result<T> fail(CodeMsg codeMsg) {
return new Result(codeMsg);
}
}
其中codeMsg为错误信息集合,里面统一规定了很多错误信息,方便调用
public class CodeMsg {
private int code;
private String msg;
public static CodeMsg SUCCESS = new CodeMsg(0,"success");
public static CodeMsg SERVER_ERROR = new CodeMsg(404,"服务端异常");
public static CodeMsg BIND_ERROR = new CodeMsg(504,"参数校验异常:%s");
public static CodeMsg PASSWORD_EMPTY=new CodeMsg(502,"密码为空");
public static CodeMsg MOBILE_EMPTY=new CodeMsg(503,"手机号不能为空");
public static CodeMsg MOBILE_TYPE_ERROR=new CodeMsg(504,"手机号格式不对");
public static CodeMsg MOBILE_NO_EXIST=new CodeMsg(505,"手机号不存在");
public static CodeMsg PASSWORD_ERROR=new CodeMsg(507,"密码错误");
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public CodeMsg fillArgs(Object... agrs) {
int code = this.code;
String messsage = String.format(this.msg, agrs);
return new CodeMsg(code,messsage);
}
}
前面已经定义好了异常的信息,而且我们自己还可以自定义异常,继承于需要抛出的异常(RuntimeException)
/**
* 定义新的异常,可以通过继承需要的异常来创建,再后面抛出
*/
@Getter
public class GlobalException extends RuntimeException {
private CodeMsg codeMsg;
public GlobalException(CodeMsg codeMsg){
this.codeMsg = codeMsg;
}
}
前面都是定义异常和继承需要捕获的异常,接下来就是真正的把异常返回给客户端
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(HttpServletRequest request,Exception exception){
if (exception instanceof GlobalException){
GlobalException globalException = (GlobalException) exception;
CodeMsg codeMsg = globalException.getCodeMsg();
return Result.fail(codeMsg);
}
else if (exception instanceof BindException){
BindException bindException = (BindException) exception;
List<ObjectError> errors = bindException.getAllErrors();
ObjectError objectError = errors.get(0);
return Result.fail(CodeMsg.BIND_ERROR.fillArgs(objectError));
}else {
return Result.fail(CodeMsg.SERVER_ERROR);
}
}
}
其中
@ControllerAdvice就是返回给客户端注解,类似
@Controller