在从事JAVA代码开发过程中,很大一部分工作是在写MVC三层逻辑代码,Dao层负责写与数据库存储的业务逻辑,Service层负责业务数据处理,而Controller层负责与前端交互处理前端请求,返回前端所需要的数据,返回前端所需要的数据层一般称为VO层,使用springboot框架,数据实体类一般情况下会由springmvc自动转换为json字符串,例如:
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public UmsAdmin getUser() {
UmsAdmin umsAdmin = new UmsAdmin();
umsAdmin.setStatus(1);
umsAdmin.setEmail("HongGe@163.com");
umsAdmin.setNickName("HongGe");
umsAdmin.setUsername("HongGe");
return umsAdmin;
}
}
使用postman请求数据如下
GET
localhost:8080/test/user
response
{
"id": null,
"username": "HongGe",
"password": null,
"icon": null,
"email": "HongGe@163.com",
"nickName": "HongGe",
"note": null,
"createTime": null,
"loginTime": null,
"status": 1
}
虽然上述代码能够正确返回数据,但是如果有很多接口,每一个接口都自行返回数据而没有统一规范的话,会给后续维护带来很多工作,比如我们无法知晓接口成功或失败,因此需要统一返回数据格式。
统一数据格式
写一个包装类,统一返回数据格式,将需要返回的数据包装起来:
public class CommonResult<T> {
/**
* 状态码
*/
private long code;
/**
* 提示信息
*/
private String message;
/**
* 数据封装
*/
private T data;
protected CommonResult() {
}
protected CommonResult(long code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> CommonResult<T> success(T data) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
}
/**
* 成功返回结果
*
* @param data 获取的数据
* @param message 提示信息
*/
public static <T> CommonResult<T> success(T data, String message) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
}
/**
* 失败返回结果
* @param errorCode 错误码
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode) {
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
}
/**
* 失败返回结果
* @param errorCode 错误码
* @param message 错误信息
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode,String message) {
return new CommonResult<T>(errorCode.getCode(), message, null);
}
/**
* 失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> failed(String message) {
return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
}
/**
* 失败返回结果
*/
public static <T> CommonResult<T> failed() {
return failed(ResultCode.FAILED);
}
/**
* 参数验证失败返回结果
*/
public static <T> CommonResult<T> validateFailed() {
return failed(ResultCode.VALIDATE_FAILED);
}
/**
* 参数验证失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> validateFailed(String message) {
return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
}
/**
* 未登录返回结果
*/
public static <T> CommonResult<T> unauthorized(T data) {
return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
}
/**
* 未授权返回结果
*/
public static <T> CommonResult<T> forbidden(T data) {
return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
}
public long getCode() {
return code;
}
public void setCode(long code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
上述CommonResult类就是包装所有实体,统一返回数据格式,接口返回如下:
{
"code": 200,
"message": "操作成功",
"data": {
"id": 11,
"name": "汽车推荐广告",
"type": 1,
"startTime": "2018-11-12T16:00:00.000+00:00",
"endTime": "2018-11-29T16:00:00.000+00:00",
"status": 1,
"clickCount": 0,
"orderCount": 0,
"url": "xxx",
"sort": 98
}
}