参考博文:https://blog.csdn.net/ZHWang102107/article/details/82931584
之前我所在公司程序员后台返回给前台的的数据结构未做统一处理,风格各不同,前台人员也对此深感头疼。这样的代码必然冗余,杂乱,不利于项目的维护与扩展,也浪费大量宝贵的时间。后面来个一个同事,对这一乱像做了改变,是的代码风格焕然一新!今天我也模仿该同事思路做了一个同样的数据封装。以下代码在参考过多人的博客后,对自己写的做了改善出来的最终版的。
封装数据类
思路就是采用泛型类来进行数据模型封装,比较简单,代码如下
/**
*
*/
package learn.until;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 返回给客户端信息实体
*
* @Author: ljg 2020年3月11日 下午9:51:26
*
* @Desc: <p>
* 用于统一返回给客户端信息实体,统一格式,提高友好度
* </p>
*/
@Data
@ApiModel
public class RestResponse<T> {
/**
* 返回码
*
*/
@ApiModelProperty(value = "返回码")
private int code;
/**
* 返回信息
*
*/
@ApiModelProperty(value = "返回信息")
private String message;
/**
* 返回数据
*/
@ApiModelProperty(value = "返回数据")
private T data;
public RestResponse(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public RestResponse(int code, String message) {
this.code = code;
this.message = message;
}
public RestResponse() {
}
}
写一个公共类来生成数据对象,我开始是在上面类中写了一个静态生成方法,我觉这样耦合度太高,所以参考了别人的博客,代码如下。
/**
*
*/
package learn.until;
import learn.until.staticdata.RestCode;
/**
*
* @Author: ljg 2020年3月12日 上午10:18:48
*
* @Desc: <p>
* </p>
*/
public class RestResposeUtil {
/**
* 成功返回成功实体
*
* @Author ljg 2020年3月11日 下午10:04:39
* @param data 返回数据
* @return
*/
public static <T> RestResponse<T> success(T data) {
RestResponse<T> restResponse = new RestResponse<T>();
restResponse.setCode(RestCode.SUCCESS.getCode());
restResponse.setMessage(RestCode.SUCCESS.getMsg());
restResponse.setData(data);
return restResponse;
}
/**
* 创建一个响应实体类
*
* @Author ljg 2020年3月11日 下午10:04:39
* @param data 返回数据
* @return
*/
public static <T> RestResponse<T> createResponse(RestCode restCode, T data) {
RestResponse<T> restResponse = new RestResponse<T>();
restResponse.setCode(restCode.getCode());
restResponse.setMessage(restCode.getMsg());
restResponse.setData(data);
return restResponse;
}
/**
* 创建一个响应实体类
*
* @Author ljg 2020年3月11日 下午10:04:39
* @param data 返回数据
* @return
*/
public static <T> RestResponse<T> createResponse(RestCode restCode) {
RestResponse<T> restResponse = new RestResponse<T>();
restResponse.setCode(restCode.getCode());
restResponse.setMessage(restCode.getMsg());
return restResponse;
}
/**
* 成功返回成功实体
*
* @Author ljg 2020年3月11日 下午10:04:39
* @param data 返回数据
* @return
*/
public static RestResponse<Object> success() {
return success(null);
}
/**
* 错误返回实体
*
* @Author ljg 2020年3月12日 上午10:26:59
* @param code 错误码
* @param msg 错误信息
* @return
*/
public static <T> RestResponse<T> error(int code, String msg) {
RestResponse<T> restResponse = new RestResponse<T>();
restResponse.setCode(code);
restResponse.setMessage(msg);
return restResponse;
}
}
建一个枚举类型,统一管理code和message,为了更好的降低耦合度,规范代码,利于后期维护,代码如下
/**
*
*/
package learn.until.staticdata;
/**
*
* @Author: ljg 2020年3月11日 下午10:07:29
*
* @Desc: <p>
* </p>
*/
public enum RestCode {
SUCCESS(200, "success"), ERROR(500, "error"), UNDEFINED_ERROR(-1, "未知错误"), EMPTY(1001, "参数为空");
int code;
String msg;
RestCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
实战代码
@ApiOperation(value = "登陆入口", notes = "登陆逻辑")
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseBody
public RestResponse<String> login(@RequestBody UserInfoCond userInfoCond) {
RestResponse<String> response = null;
try {
response = RestResposeUtil.createResponse(RestCode.SUCCESS, loginService.login(userInfoCond));
} catch (Exception e) {
response = ExceptionHandleUtil.handle(e);
}
return response;
}