【AgileTC】_统一响应体构建

【AgileTC】_统一响应体构建

  • 为Controller层的所有方法创建一个统一响应体一方面可以使controller层方法清晰简洁,另一方面相当于在http响应状态码的基础之上再加了一层状态码,方便前端更加精确地向用户反馈执行状况;
  • 1.创建一个接口Status状态,对响应状态的功能进行抽象;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public interface Status {

    //是否成功状态
    boolean isSuccess();

    //获取状态码值
    int getStatus();

    //获取错误码
    String getCode();

    //获取状态描述
    String getMsg();

    //获取状态描述
    String getMsg(Object... format);
    }
  • 2.创建一个实现Status的枚举类StatusCode状态码,在其中创建所有异常情况对应的StatusCode类对象,这些对象有两个属性:

    • int类型的status表示状态码值;
    • String类型的msg表示状态码信息;

    Enum枚举类提供了一个name()方法用于返回枚举对象的对象名字符串;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public enum StatusCode implements Status {

    // 枚举
    // 这里的200不建议改,如果需要改,前端组件判断success的判断也需要更改,单纯兼容,如果有代码洁癖可以改为10000
    SERVICE_RUN_SUCCESS(200, "服务运行成功"),
    JSON_FORMAT_ERROR(10004, "JSON格式不正确"),
    DATA_FORMAT_ERROR(10005, "数据格式化异常"),
    HTTP_ACCESS_ERROR(10006, "HTTP访问异常"),
    FILE_FORMAT_ERROR(10007, "文件格式不对,请上传xmind文件"),
    FILE_IMPORT_ERROR(10008, "导入失败,请稍后再试"),
    FILE_EXPORT_ERROR(10009, "导出失败,请稍后再试"),
    NODE_ALREADY_EXISTS(20001, "节点已存在"),
    WS_UNKNOWN_ERROR(100010, "websocket访问异常"),

    // 内部异常
    INTERNAL_ERROR(10400, "内部参数校验或逻辑出错"),
    VERSION_NOT_MATCH(10500,"暂不支持xmind zen版本,请上传xmind 8版本文件"),
    NOT_FOUND_ENTITY(10600, "没有该项数据"),

    // 统一异常
    SERVER_BUSY_ERROR(99999, "服务器正忙,请稍后再试");

    private int status;
    private String msg;

    StatusCode(int status, String message) {
    this.status = status;
    this.msg = message;
    }

    @Override
    public boolean isSuccess() {
    return getStatus() == 10000;
    }

    @Override
    public int getStatus() {
    return status;
    }

    //name()方法是枚举类的一个封装方法,用于返回枚举对象的对象名,
    //比如SERVER_BUSY_ERROR.name()的结果为"SERVER_BUSY_ERROR"。
    @Override
    public String getCode() {
    return name();
    }

    @Override
    public String getMsg() {
    return String.format(msg, "");
    }

    @Override
    public String getMsg(Object... objects) {
    if (objects == null) {
    return getMsg();
    }
    return String.format(msg, objects);
    }
    }
  • 3.创建一个Controller层的统一响应体类Response<T>,项目中所有Controller方法的返回值类型都是该类,该类有三个属性:

    • Integer类型的code,承接状态码中的status,用于表示该次请求的响应状态;
    • String类型的msg,表示响应信息;
    • T(泛型)类型的data,表示真正的响应数据;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    @Data
    public class Response<T> {
    private Integer code;
    private String msg;
    private T data;

    public Response() {
    this.code = StatusCode.SERVICE_RUN_SUCCESS.getStatus();
    }

    public static <T> Response<T> build(int status, String msg) {
    return build(status, msg, null);
    }

    public static <T> Response<T> build(Status status, String msg) {
    return build(status.getStatus(), msg, null);
    }

    public static <T> Response<T> build(Status status) {
    return build(status.getStatus(), status.getMsg(), null);
    }

    public static <T> Response<T> build(int status, String msg, T data) {
    Response<T> response = new Response<>();
    response.setCode(status);
    response.setMsg(msg);
    response.setData(data);
    return response;
    }

    public static <T> Response<T> success() {
    return build(StatusCode.SERVICE_RUN_SUCCESS);
    }

    public static <T> Response<T> success(T data) {
    return build(StatusCode.SERVICE_RUN_SUCCESS.getStatus(), StatusCode.SERVICE_RUN_SUCCESS.getMsg(), data);
    }
    }