趁项目间隙,想寻找一个用的顺手的通用返回类。对这个类的要求有如下几点:
- 不需要显示的手动new出
- swagger能识别,前端友好
- 支持泛型
从网上一番搜罗,略作整理,得出了一个满足我所有要求的返回类。
话不多说,直接上代码。代码分为两部分,首先是状态码枚举ResultEnum.java
public enum ResultEnum {
/**
* 成功
*/
SUCCESS(2000, "success"),
/**
* 失败
*/
ERROR(5000, "error"),
/**
* 传参出错
*/
PARAM_ERROR(5001, "params error"),
/**
* 必传参数丢失
*/
PARAM_MISS_ERROR(5002, "param miss"),
/**
* 记录不存在
*/
RECORD_NOT_EXIST(5003, "record is not exist!");
private final Integer code;
private final String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
该枚举可自行扩展,code可以更改为String类型以支持带字母的状态码。
接着就是主角Result.java
@Data
public class Result<T> {
/**
* 错误码
*/
private final Integer code;
/**
* 提示信息
*/
private final String msg;
/**
* 具体的内容
*/
private T data;
/**
* 成功时调用, 没有data内容
* @return
*/
public static <String> Result<String> success() {
return Result.build(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null);
}
/**
* 成功时候的调用
*
* @param <T> 返回实体的类型
* @return Result
*/
public static <T> Result<T> success(T data) {
return new Result<>(data);
}
/**
* 根据返回的状态枚举, 构建返回结果
*
* @param resultEnum {@link ResultEnum} 返回状态枚举
* @return Result
*/
public static <Object> Result<Object> build(ResultEnum resultEnum) {
return new Result<>(resultEnum);
}
/**
* 根据自定义状态码{@code code}和自定义提示信息{@code msg}构建返回结果
*
* @param code 自定义状态码
* @param msg 自定义提示信息
* @return Result
*/
public static <Object> Result<Object> build(Integer code, String msg) {
return new Result<>(code, msg);
}
/**
* 根据自定义状态码{@code code}, 自定义提示信息{@code msg}以及返回实体{@code T}构建返回结果
*
* @param code 自定义状态码
* @param msg 自定义提示信息
* @param <T> 返回实体的类型
* @return Result
*/
public static <T> Result<T> build(Integer code, String msg, T data) {
return new Result<>(code, msg, data);
}
/**
* 出错时调用, 自定义提示信息{@code msg}
*
* @param msg 自定义提示信息
* @param <T> 返回实体的类型
* @return Result
*/
public static <T> Result<T> error(String msg) {
return new Result<>(msg);
}
/**
* 出错时调用, 根据返回实体{@code T}构建返回结果
*
* @param data 返回实体
* @param <T> 返回实体的类型
* @return Result
*/
public static <T> Result<T> error(T data) {
return new Result<>(ResultEnum.ERROR.getCode(), ResultEnum.ERROR.getMsg(), data);
}
private Result(T data) {
this.code = ResultEnum.SUCCESS.getCode();
this.msg = ResultEnum.SUCCESS.getMsg();
this.data = data;
}
private Result(String msg) {
this.code = ResultEnum.ERROR.getCode();
this.data = null;
this.msg = msg;
}
private Result(ResultEnum resultEnum) {
this.code = resultEnum.getCode();
this.msg = resultEnum.getMsg();
}
private Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
private Result(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}