package io.github.xxyopen.novel.core.common.resp;  
  
import io.github.xxyopen.novel.core.common.constant.ErrorCodeEnum;  
import io.swagger.v3.oas.annotations.media.Schema;  
import lombok.Getter;  
  
import java.util.Objects;  
  
/**  
 * Http Rest 响应工具及数据格式封装  
 *  
 * @author xiongxiaoyang
 * @date 2022/5/11 
 * */
@Getter  
public class RestResp<T> {  
  
    /**  
     * 响应码  
     */  
    @Schema(description = "错误码,00000-没有错误")  
    private String code;  
  
    /**  
     * 响应消息  
     */  
    @Schema(description = "响应消息")  
    private String message;  
  
    /**  
     * 响应数据  
     */  
    @Schema(description = "响应数据")  
    private T data;  
  
    private RestResp() {  
        this.code = ErrorCodeEnum.OK.getCode();  
        this.message = ErrorCodeEnum.OK.getMessage();  
    }  
  
    private RestResp(ErrorCodeEnum errorCode) {  
        this.code = errorCode.getCode();  
        this.message = errorCode.getMessage();  
    }  
  
    private RestResp(T data) {  
        this();  
        this.data = data;  
    }  
  
    /**  
     * 业务处理成功,无数据返回  
     */  
    public static RestResp<Void> ok() {  
        return new RestResp<>();  
    }  
  
    /**  
     * 业务处理成功,有数据返回  
     */  
    public static <T> RestResp<T> ok(T data) {  
        return new RestResp<>(data);  
    }  
  
    /**  
     * 业务处理失败  
     */  
    public static RestResp<Void> fail(ErrorCodeEnum errorCode) {  
        return new RestResp<>(errorCode);  
    }  
  
  
    /**  
     * 系统错误  
     */  
    public static RestResp<Void> error() {  
        return new RestResp<>(ErrorCodeEnum.SYSTEM_ERROR);  
    }  
  
    /**  
     * 判断是否成功  
     */  
    public boolean isOk() {  
        return Objects.equals(this.code, ErrorCodeEnum.OK.getCode());  
    }  
  
}

异常枚举类

package io.github.xxyopen.novel.core.common.constant;  
  
import lombok.AllArgsConstructor;  
import lombok.Getter;  
  
/**  
 * 错误码枚举类。  
 * <p>  
 * 错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。 错误产生来源分为 A/B/C, A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付 超时等问题; B  
 * 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题; C 表示错误来源 于第三方服务,比如 CDN 服务出错,消息投递超时等问题;四位数字编号从 0001 到 9999,大类之间的  
 * 步长间距预留 100。  
 * <p>  
 * 错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。 在无法更加具体确定的错误场景中,可以直接使用一级宏观错误码。  
 *  
 * @author xiongxiaoyang * @date 2022/5/11
 * */
@Getter  
@AllArgsConstructor  
public enum ErrorCodeEnum {  
  
    /**  
     * 正确执行后的返回  
     */  
    OK("00000", "一切 ok"),  
  
    /**  
     * 一级宏观错误码,用户端错误  
     */  
    USER_ERROR("A0001", "用户端错误"),  
  
    /**  
     * 二级宏观错误码,用户注册错误  
     */  
    USER_REGISTER_ERROR("A0100", "用户注册错误"),  
  
    /**  
     * 用户未同意隐私协议  
     */  
    USER_NO_AGREE_PRIVATE_ERROR("A0101", "用户未同意隐私协议"),  
  
    /**  
     * 注册国家或地区受限  
     */  
    USER_REGISTER_AREA_LIMIT_ERROR("A0102", "注册国家或地区受限"),  
  
    /**  
     * 用户验证码错误  
     */  
    USER_VERIFY_CODE_ERROR("A0240", "用户验证码错误"),  
  
    /**  
     * 用户名已存在  
     */  
    USER_NAME_EXIST("A0111", "用户名已存在"),  
  
    /**  
     * 用户账号不存在  
     */  
    USER_ACCOUNT_NOT_EXIST("A0201", "用户账号不存在"),  
  
    /**  
     * 用户密码错误  
     */  
    USER_PASSWORD_ERROR("A0210", "用户密码错误"),  
  
    /**  
     * 二级宏观错误码,用户请求参数错误  
     */  
    USER_REQUEST_PARAM_ERROR("A0400", "用户请求参数错误"),  
  
    /**  
     * 用户登录已过期  
     */  
    USER_LOGIN_EXPIRED("A0230", "用户登录已过期"),  
  
    /**  
     * 访问未授权  
     */  
    USER_UN_AUTH("A0301", "访问未授权"),  
  
    /**  
     * 用户请求服务异常  
     */  
    USER_REQ_EXCEPTION("A0500", "用户请求服务异常"),  
  
    /**  
     * 请求超出限制  
     */  
    USER_REQ_MANY("A0501", "请求超出限制"),  
  
    /**  
     * 用户评论异常  
     */  
    USER_COMMENT("A2000", "用户评论异常"),  
  
    /**  
     * 用户评论异常  
     */  
    USER_COMMENTED("A2001", "用户已发表评论"),  
  
    /**  
     * 作家发布异常  
     */  
    AUTHOR_PUBLISH("A3000", "作家发布异常"),  
  
    /**  
     * 小说名已存在  
     */  
    AUTHOR_BOOK_NAME_EXIST("A3001", "小说名已存在"),  
  
    /**  
     * 用户上传文件异常  
     */  
    USER_UPLOAD_FILE_ERROR("A0700", "用户上传文件异常"),  
  
    /**  
     * 用户上传文件类型不匹配  
     */  
    USER_UPLOAD_FILE_TYPE_NOT_MATCH("A0701", "用户上传文件类型不匹配"),  
  
    /**  
     * 一级宏观错误码,系统执行出错  
     */  
    SYSTEM_ERROR("B0001", "系统执行出错"),  
  
    /**  
     * 二级宏观错误码,系统执行超时  
     */  
    SYSTEM_TIMEOUT_ERROR("B0100", "系统执行超时"),  
  
    /**  
     * 一级宏观错误码,调用第三方服务出错  
     */  
    THIRD_SERVICE_ERROR("C0001", "调用第三方服务出错"),  
  
    /**  
     * 一级宏观错误码,中间件服务出错  
     */  
    MIDDLEWARE_SERVICE_ERROR("C0100", "中间件服务出错");  
  
    /**  
     * 错误码  
     */  
    private final String code;  
  
    /**  
     * 中文描述  
     */  
    private final String message;  
  
}	

通过上面我们发现,RestResp()的无参构造返回成功后的数据,而有参构造返回异常枚举类数据,这里是如何取得异常枚举的code和value的?

使用 Lombok 注解快速配置枚举类 (enum)_罐装面包的博客-CSDN博客_lombok 枚举

这里加了两个特殊的注解:@Getter和@AllArgsConstructor,表示自动配置get方法和有参构造

我们以前如何配置返回数据封装的?

SpringBoot电商项目用户模块API统一返回对象

最后注意下javadoc规范

系统接口-swagger与Springdoc