SpringBoot 2.x 返回统一数据格式

该博客详细介绍了Java API的设计规范,包括返回码定义,如成功、参数错误、用户错误和接口异常的范围。同时,展示了统一的JSON响应实体`ResultBody`,用于封装业务操作的成功或失败信息及数据。还提供了一个`ResultTool`工具类,方便快速构建成功的或失败的响应。这些规范确保了API的一致性和易用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、返回码定义

/**
 * 返回码定义
 * 规定:
 * # 1 表示成功
 * # 1001~1999 区间表示参数错误
 * # 2001~2999 区间表示用户错误
 * # 3001~3999 区间表示接口异常
 */
public enum ResultCode {

    /* 成功 */
    SUCCESS(200, "成功"),

    /* 默认失败 */
    COMMON_FAIL(999, "失败"),

    /* 参数错误:1000~1999 */
    PARAM_NOT_VALID(1001, "参数无效"),
    PARAM_IS_BLANK(1002, "参数为空"),
    PARAM_TYPE_ERROR(1003, "参数类型错误"),
    PARAM_NOT_COMPLETE(1004, "参数缺失"),

    /* 用户错误 */
    USER_NOT_LOGIN(2001, "用户未登录"),
    USER_ACCOUNT_EXPIRED(2002, "账号已过期"),
    USER_CREDENTIALS_ERROR(2003, "密码错误"),
    USER_CREDENTIALS_EXPIRED(2004, "密码过期"),
    USER_ACCOUNT_DISABLE(2005, "账号不可用"),
    USER_ACCOUNT_LOCKED(2006, "账号被锁定"),
    USER_ACCOUNT_NOT_EXIST(2007, "账号不存在"),
    USER_ACCOUNT_ALREADY_EXIST(2008, "账号已存在"),
    USER_ACCOUNT_USE_BY_OTHERS(2009, "账号下线"),

    /* 业务错误 */
    NO_PERMISSION(3001, "没有权限");

    /**
     * 响应码
     */
    private Integer code;

    /**
     * 返回消息
     */
    private String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 根据 code 获取 message
     *
     * @param code
     * @return
     */
    public static String getMessageByCode(Integer code) {
        for (ResultCode result : values()) {
            if (result.getCode().equals(code)) {
                return result.getMessage();
            }
        }
        return null;
    }

}

2、统一返回 Json 实体

/**
 * 统一返回 Json 实体
 */
public class ResultBody<T> implements Serializable {

    /***
     * 业务操作是否成功
     */
    private Boolean status;

    /**
     * 响应码
     */
    private Integer errorCode;

    /**
     * 返回消息
     */
    private String errorMessage;

    /**
     * 返回数据
     */
    private T data;

    /**
     * 私有化构造函数
     */
    private ResultBody() {
    }

    /**
     * 统一返回实体
     *
     * @param status 业务操作是否成功
     */
    public ResultBody(boolean status) {
        this.status = status;
        this.errorCode = status ? ResultCode.SUCCESS.getCode() : ResultCode.COMMON_FAIL.getCode();
        this.errorMessage = status ? ResultCode.SUCCESS.getMessage() : ResultCode.COMMON_FAIL.getMessage();
    }

    /**
     * 统一返回实体
     *
     * @param status     业务操作是否成功
     * @param resultEnum 返回枚举消息
     */
    public ResultBody(boolean status, ResultCode resultEnum) {
        this.status = status;
        this.errorCode = status ? ResultCode.SUCCESS.getCode() : (resultEnum == null ? ResultCode.COMMON_FAIL.getCode() : resultEnum.getCode());
        this.errorMessage = status ? ResultCode.SUCCESS.getMessage() : (resultEnum == null ? ResultCode.COMMON_FAIL.getMessage() : resultEnum.getMessage());
    }

    /**
     * 统一返回实体
     *
     * @param status 业务操作是否成功
     * @param data   返回数据
     */
    public ResultBody(boolean status, T data) {
        this.status = status;
        this.errorCode = status ? ResultCode.SUCCESS.getCode() : ResultCode.COMMON_FAIL.getCode();
        this.errorMessage = status ? ResultCode.SUCCESS.getMessage() : ResultCode.COMMON_FAIL.getMessage();
        this.data = data;
    }

    /**
     * 统一返回实体
     *
     * @param status     业务操作是否成功
     * @param resultEnum 设置返回枚举消息
     * @param data       返回数据
     */
    public ResultBody(boolean status, ResultCode resultEnum, T data) {
        this.status = status;
        this.errorCode = status ? ResultCode.SUCCESS.getCode() : (resultEnum == null ? ResultCode.COMMON_FAIL.getCode() : resultEnum.getCode());
        this.errorMessage = status ? ResultCode.SUCCESS.getMessage() : (resultEnum == null ? ResultCode.COMMON_FAIL.getMessage() : resultEnum.getMessage());
        this.data = data;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(Integer errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}

3、返回体构造工具

/**
 * 返回体构造工具
 *
 * @author jinlong.qian@xiaobao100.com
 * @create 2020/11/24
 */
public class ResultTool {

    /**
     * 业务操作成功
     *
     * @return
     */
    public static ResultBody success() {
        return new ResultBody(true);
    }

    /**
     * 业务操作失败
     *
     * @return
     */
    public static ResultBody fail() {
        return new ResultBody(false);
    }

    /**
     * 业务操作成功
     *
     * @param data 返回数据
     * @param <T>
     * @return
     */
    public static <T> ResultBody<T> success(T data) {
        return new ResultBody(true, data);
    }

    /**
     * 业务操作失败
     *
     * @param resultEnum 设置返回枚举消息
     * @return
     */
    public static ResultBody fail(ResultCode resultEnum) {
        return new ResultBody(false, resultEnum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值