Skip to content

通用响应对象设计

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;
    }

}

Released under the MIT License.