1.规定后台接口响应给前端页面的统一数据格式为:
成功:
{
"code": "200",
"msg": "success",
"data": {
"userId": "1",
"username": "sven",
"password": "123"
}
}
失败:
{
"code": "500",
"msg": "服务器异常!",
"data": null
}
即controller层方法的返回值统一抽象为一个Result类,以规范响应到前端的数据格式。
2.定义一个枚举,封装错误时的响应内容(状态码与消息)
public enmu CodeMsg{
USER_NOT_EXIST(40001,"用户名不存在"),
PASS_IS_WRONG(40002,"密码与用户名不匹配");
private int code;
private String msg;
ExceptionMessage(int code, String msg) {
this.num = code;
this.desc = msg;
}
public String getMsg(){
return this.msg;
}
public Integer getCode(){
return this.code;
}
}
3.增加一个Result类,使用泛型与否皆可
class Result<T>{
Integer code; //响应状态码
String msg; //响应消息
T data; //响应实体
// ... 省略getter方法
public <T> static Result success(T t){
Result result = new Result<T>();
result.setCode(200);
result.setMsg("success");
result.setData(t);
return result;
}
public static Result success(){
return success(null);
}
public static Result error(CodeMsg codeMsg){
Result result = new Result<T>();
result.setCode(codeMsg.getCode);
result.setMsg(codeMsg.getMsg());
result.setData(null);
return null;
}
}
4.思路:自定一个全局异常,在service层中遇到会返回失败的情况就抛出(抛出的自定义异常对象需要把CodeMsg对象封装进去,这样才能把错误内容响应到前端),交由controller层去处理,controller层中不进行try catch,最终由springmvc的全局异常处理机制(filter)进行拦截处理,所以还需要自定义拦截类的处理逻辑。
// 自定义全局异常
public class ClobalException extends RuntimeException{
CodeMsg codeMsg;
ClobalException(CodeMsg codeMsg){
this.codeMsg = codeMsg;
}
public CodeMsg getCodeMsg(){
return codeMsg;
}
}
// 自定义全局异常处理器
@ControllerAdvice //自定义全局异常处理类
@Component
public class GlobalExceptionHandler{
@ExceptionHandler //声明指定异常处理方法
@ResponseBody
public Result handler(GlobalRuntimeException exception){
return Result.error(exception.getCodeMsg());
}
}