通用响应对象设计
RestResult 通用响应对象
java
/**
* @author Gnerv LiGen
*/
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder({"success", "code", "title", "detail", "instance", "data", "page", "timestamp", "version", "traceId"})
public class RestResult<T> {
/**
* 业务是否成功
*/
private boolean success;
/**
* 业务状态码
*/
private int code;
/**
* 响应消息标题,例:参数错误
*/
private String title;
/**
* 响应消息详情,例:参数[ukId]不能为空。
*/
private String detail;
/**
* 响应码对应示例,一般用于指定错误码说明链接地址。
*/
private String instance;
/**
* 响应数据
*/
private T data;
/**
* 分页信息
*/
private RestResultPage page;
/**
* 时间戳
*/
private Long timestamp;
/**
* 接口版本
*/
private String version;
/**
* 链路追踪id
*/
private String traceId;
private RestResult() {
}
public static <T> RestResult<T> ok() {
return build(RestResultCode.CODE_200);
}
public static <T> RestResult<T> created() {
return build(RestResultCode.CODE_201);
}
public static <T> RestResult<T> updated() {
return build(RestResultCode.CODE_202);
}
public static <T> RestResult<T> deleted() {
return build(RestResultCode.CODE_203);
}
public static <T> RestResult<T> ok(T data) {
return build(RestResultCode.CODE_200, data);
}
public static <T> RestResult<T> ok(RestResultCode restResultCode) {
return build(restResultCode);
}
public static <T> RestResult<T> ok(RestResultCode restResultCode, T data) {
return build(restResultCode, data);
}
public static <T> RestResult<T> error() {
return build(RestResultCode.CODE_500);
}
public static <T> RestResult<T> error(T data) {
return build(RestResultCode.CODE_500, data);
}
public static <T> RestResult<T> error(RestResultCode restResultCode) {
return build(restResultCode);
}
public static <T> RestResult<T> error(RestResultCode restResultCode, String detail) {
return build(restResultCode, detail);
}
public static <T> RestResult<T> error(RestResultCode restResultCode, String detail, String instance) {
return build(restResultCode.getCode(), restResultCode.getDescription(), detail, instance, null);
}
public static <T> RestResult<T> error(RestResultCode restResultCode, T data) {
return build(restResultCode.getCode(), restResultCode.getDescription(), null, null, data);
}
private static <T> RestResult<T> build(RestResultCode restResultCode) {
return build(restResultCode.getCode(), restResultCode.getDescription(), null, null, null);
}
private static <T> RestResult<T> build(RestResultCode restResultCode, String detail) {
return build(restResultCode.getCode(), restResultCode.getDescription(), detail, null, null);
}
private static <T> RestResult<T> build(RestResultCode restResultCode, T data) {
return build(restResultCode.getCode(), restResultCode.getDescription(), null, null, data);
}
private static <T> RestResult<T> build(Integer code, String title, String detail, String instance, T data) {
RestResult<T> result = new RestResult<>();
result.setCode(code);
result.setTitle(title);
result.setDetail(detail);
result.setInstance(instance);
result.setData(data);
result.setTimestamp(Instant.now().toEpochMilli());
return result;
}
public RestResult<T> page(int page, int size, int total) {
RestResultPage restResultPage = new RestResultPage(page, size, total);
this.setPage(restResultPage);
return this;
}
}RestResultCode 通用返回状态码对象
java
/**
* <p>
* 通用返回状态码
* </p>
*
* @author Gnerv LiGen
*/
@Getter
public enum RestResultCode {
/**
* 请求成功 无特殊需求 一般使用此响应码
*/
CODE_200(200, "请求成功"),
/**
* 用于明确提示用户提交的新增资源的操作有效并成功执行
*/
CODE_201(201, "创建成功"),
/**
* 用于明确提示用户提交的更新资源的操作有效并成功执行
*/
CODE_202(202, "更新成功"),
/**
* 用于明确提示用户提交的删除资源的操作有效并成功执行
*/
CODE_203(203, "删除成功"),
/**
* 用于明确提示用户提交的获取资源的操作有效并成功执行 但是未在服务器中获取到数据
*/
CODE_204(204, "请求成功,但无内容。"),
/**
* 用于允许部分创建、更新、删除失败的业务情况 按业务需求返回相应的响应信息
*/
CODE_206(206, "部分成功"),
CODE_209(209, "认证成功"),
CODE_210(210, "注销成功"),
/**
* 用于创建或者更新时需要的资源不存在的业务情况
*/
CODE_304(304, "创建资源不存在"),
CODE_305(305, "更新资源不存在"),
CODE_306(306, "删除资源不存在"),
/**
* 用于请求参数错误
*/
CODE_400(400, "请求参数错误"),
/**
* 用于禁止操作对应资源时
*/
CODE_403(403, "禁止操作资源"),
/**
* 用于访问资源资源不存在时
*/
CODE_404(404, "资源不存在"),
/**
* 用于没有访问接口权限时
*/
CODE_407(407, "没有访问此接口的权限"),
/**
* 授权过期或者失效
*/
CODE_408(408, "授权过期或者失效"),
/**
* 用于登陆失败时
*/
CODE_410(410, "认证失败"),
/**
* 用于明确提示用户错误原因
*/
CODE_412(412, "客户端请求信息的先决条件错误"),
CODE_500(500, "系统异常"),
CODE_503(503, "数据库异常"),
CODE_504(504, "远端服务器异常");
private final Integer code;
private final String description;
RestResultCode(Integer code, String description) {
this.code = code;
this.description = description;
}
public static RestResultCode getType(Integer code) {
for (RestResultCode type : values()) {
if (type.code.equals(code)) {
return type;
}
}
return null;
}
}RestResultPage 通用分页对象
java
/**
* @author Gnerv LiGen
*/
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder({"page", "size", "total"})
public class RestResultPage {
private int page;
private int size;
private int total;
private RestResultPage() {
}
public RestResultPage(int page, int size, int total) {
this.page = page;
this.size = size;
this.total = total;
}
}