java高级特性之泛型,实战进阶
继续之前一篇泛型的基础思想概念来说,本文介绍一下进阶实战,来封装一个服务端响应类
这个东西有什么用呢?如果说自己是全栈工程师的话可能自己能搞定就不说了,正常来说一个大型项目,不仅仅是前后端分离还有就是很多人合作,如果不限定返回的结过,可能每个接口返回的样式千奇百怪。比如你返回了用户信息,他返回来了个错误msg等。对于前段来说,需要很多的判断,影响整个项目的可扩展性和效率
比如这样:
// 获取用户信息,正确返回
{
"username": "jiarupc",
"nickname": "法外狂徒、张三",
"create_date": "2020-12-31 00:00:00"
}
// 获取用户信息,错误返回
{
"msg": "缺少参数,请传入 token"
}
所以为了解决这一问题,必须封装一个统一的响应类
1.设计
服务端响应类有 2 个要点:返回值、错误码。
先来看返回值。在返回前端的时候,我们必须至少要有这 3 个信息:
code,响应代码;
data,响应数据;
msg,响应信息;
其中响应代码,我们自己设计,大概如下
200-请求成功
101-执行错误
102-参数错误
设计整体就是这样那么,接下来就是开发工作了。
2.开发
2.1响应代码
public enum ResponseCode {
// 成功返回
SUCCESS(200, "SUCCESS"),
// 执行错误
ERROR(101, "ERROR"),
// 参数错误
ILLEGAL_ARGUMENT(102, "ILLEGAL_ARGUMENT"));
private final int code;
private final String desc;
ResponseCode(int code, String desc) {
this.code = code;
this.desc = desc;
}
// 省略 getter 方法
}
2.2 服务端响应类
public class ServerResponse<T> implements Serializable {
// 响应代码
private int code;
// 响应信息
private String msg;
// 响应数据
private T data;
/**
* 构造方法
*/
private ServerResponse(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
private ServerResponse(int code, T data) {
this.code = code;
this.data = data;
}
private ServerResponse(int code, String msg) {
this.code = code;
this.msg = msg;
}
private ServerResponse(int code) {
this.code = code;
}
/**
* 请求成功
* @param msg 返回信息
* @param data 泛型数据
* @param <T> 返回数据,可以不填
* @return 1.状态码(默认) 2.返回信息 3.泛型数据
*/
public static <T> ServerResponse<T> createSuccess(String msg, T data) {
return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg, data);
}
public static <T> ServerResponse<T> createSuccess(T data) {
return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), data);
}
public static <T> ServerResponse<T> createSuccess(String msg) {
return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg);
}
public static <T> ServerResponse<T> createSuccess() {
return new ServerResponse<>(ResponseCode.SUCCESS.getCode());
}
/**
* 请求失败
* @param code
* @param msg
* @return 1.状态码(自定义) 2.返回信息(自定义)
*/
public static <T> ServerResponse<T> createError(int code, String msg) {
return new ServerResponse<>(code, msg);
}
public static <T> ServerResponse<T> createError() {
return new ServerResponse<>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());
}
public static <T> ServerResponse<T> createError(String msg) {
return new ServerResponse<>(ResponseCode.ERROR.getCode(), msg);
}
// 省略 getter 方法
}
结束
至此我们的封住类就完成了,就可以做出规定,service,controller层返回结果都要用这个类封装。