【AgileTC】_统一响应体构建
- 为Controller层的所有方法创建一个统一响应体一方面可以使controller层方法清晰简洁,另一方面相当于在http响应状态码的基础之上再加了一层状态码,方便前端更加精确地向用户反馈执行状况;
1.创建一个接口Status状态,对响应状态的功能进行抽象;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public 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
60public 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;
}
public boolean isSuccess() {
return getStatus() == 10000;
}
public int getStatus() {
return status;
}
//name()方法是枚举类的一个封装方法,用于返回枚举对象的对象名,
//比如SERVER_BUSY_ERROR.name()的结果为"SERVER_BUSY_ERROR"。
public String getCode() {
return name();
}
public String getMsg() {
return String.format(msg, "");
}
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
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);
}
}