SpringBoot统一标准响应格式及异常处理
一.概述
在开发SpringBoot后端服务时,一般需要给前端统一的响应格式及异常处理,方便前端调试及配置错误提示等。
比如:自定义Response结构,若每个开发者封装各自的Response结构,造成不一致,不利于前端处理,
因此我们需要将响应格式统一起来,定义一个统一的标准响应格式。
二.统一响应
2.1 定义响应标准格式
一般至少如下三点:
- code:响应状态码,由后端统一定义
- message:响应的消息;
- data:响应返回数据。
例如:
{
"code": "500",
"message": "该用户已存在",
"data": null
}
2.2、定义统一响应对象
/**
* @Description: TODO:定义一统一的响应对象类
* @Author:
* @CreateDate:
* @Version: V1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "定义一统一的响应对象")
public class ResultVO<T> implements Serializable {
private static final long serialVersionUID = -2548645345465031121L;
@ApiModelProperty(value = "响应状态码")
private Integer code;
@ApiModelProperty(value = "响应的消息")
private String message;
@ApiModelProperty(value = "响应返回数据")
private T data;
private ResultVO (AppHttpCodeEnum resultStatus, T data) {
this.code = resultStatus.getCode();
this.message= resultStatus.getMsg();
this.data = data;
}
/**
* 功能描述:响应成功返回结果
*/
public static <T> ResultVO success(T data){
ResultVO resultVO = new ResultVO(
AppHttpCodeEnum.SUCCESS.getCode(),
AppHttpCodeEnum.SUCCESS.getMessage(),
data
);
return resultVO;
}
/**
* 功能描述:定义统一返回数据并自定义message消息
*/
public static <T> ResultVO success(String message,T data){
ResultVO resultVO = new ResultVO(
AppHttpCodeEnum.SUCCESS.getCode(),
message,data);
return resultVO;
}
/**
* 功能描述:抛出异常 返回错误信息
* 默认失败返回
*/
public static <T> ResultVO<T> fail() {
return new ResultVO<T>(
AppHttpCodeEnum.FAIL.getCode(),
AppHttpCodeEnum.FAIL.getMessage(),
null);
}
public static <T> ResultVO<T> fail(Interger code, String message ) {
return new ResultVO<T>(code,message, null);
}
}
2.3、定义响应状态码
@Getter
@AllArgsConstructor
public enum AppHttpCodeEnum {
SUCCESS(200, "操作成功"),
FAIL(500,"操作失败"),
BIZ_ERROR(1000, "通用业务异常"),
FILE_OUT_MAX(9000, "文件超出最大限制"),
FILE_FORMAT_ERROR(9001, "文件格式不正确"),
PARAM_ERROR(9050, "参数错误"),
JSON_FORMAT_ERROR(9051, "Json解析异常"),
SQL_ERROR(9052, "Sql解析异常"),
NETWORK_TIMEOUT(9510, "网络超时"),
UNKNOWN_INTERFACE(9520, "未知的接口"),
REQ_MODE_NOT_SUPPORTED(9530, "请求方式不支持"),
SYS_ERROR(9999, "系统异常");
NO_LOGIN(401, "未登录"),
UNAUTHORIZED(),
USERNAME_EXIST(501, "用户名已存在");
private Integer code; //响应状态码
private String message; //响应的消息
}