在平时工作中,咱们写代码可能都在堆增删改查,很少有机会加上 Java 的高级个性。比方,泛型,你肯定在 Mybatis、Hibernate 这些长久化框架中用过。可轮到本人开发的时候,却发现这个货色几乎鸡肋,齐全用不上。
置信我,这种感觉很失常。因为开源框架往往要用同一套算法,来应答不同的数据结构,而 Java 的高级个性能缩小反复代码,从而进步我的项目的可维护性。
然而,咱们可能身处小公司,我的项目做完就间接交给客户了。你在最短时间实现工作就行,我的项目齐全没有保护的必要。
然而,没有关系。这次咱们来解锁泛型,用它来封装一个服务端返回类。
需要剖析
不晓得你有没有接手过一些老我的项目?那时候,SpringMVC 才刚刚进去,大家对代码标准也没概念。后果,碰上个这么不便的框架,后端开发人员就想也不想,间接把各种实体类返回给前端。
然而,工夫一久,问题就来了。
首先,数据没法保障一致性。你申请某个接口的时候,如果传入的参数不同,失去的后果必定也会不同。你看上面这个例子:
// 获取用户信息,正确返回
{
"username": "jiarupc",
"nickname": "法外狂徒、张三",
"create_date": "2020-12-31 00:00:00"
}
// 获取用户信息,谬误返回
{"msg": "短少参数,请传入 token"}
而后,前端没法解决。你想想看,一个接口如果有时候就返回一堆用户信息,有时候又只返回一条错误信息,这得写多少 if-else 判断呀?
最初,没法团队单干。如果碰上简单的我的项目,起码也要几个人一起开发。这时候,要是返回格局没有一个规范,每个人都依照本人的想法轻易写,那我的项目迟早得乱套。
事实上,在接手一些老我的项目时,你会常常看到这种状况。业务明明不简单,但只有改了一点货色,好几个前端页面就白屏了。
这时候,如果你想基本解决问题,就必须封装对立服务端响应类。
设计 - 服务端响应类
服务端响应类有 2 个要点:返回值、错误码。
先来看返回值。在返回前端的时候,咱们必须要有这 3 个信息:
- code,响应代码;
- data,响应数据;
- msg,响应信息;
其中,咱们还要进一步设计 响应代码
,让它能适配更简单的环境,这里给出几个罕用的响应码,你也能够依据理论状况本人设计。
- 200- 申请胜利
- 101- 执行谬误
- 102- 参数谬误
整体的设计工作就实现了,看起来没啥技术含量,可值得你器重。软件开发中,有些工作尽管很简略,但影响重大,服务端响应类就是这样。
那么,接下来就是开发工作了。
开发 - 服务端响应类
首先,定义 响应代码
,我用的是枚举。
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 办法
}
而后,创立 服务端响应类
。其中,为了让 data- 响应数据
适配更多的业务场景,咱们用泛型来定义它。
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 办法
}
开发工作也实现了,接下来,咱们能够做出规定,在 Controller 层
、Service 层
中,返回数据必须是 ServerResponse
,不许重整旗鼓。
到了这儿,老我的项目的数据凌乱问题,就被圆满解决了。
写在最初
泛型是 Java 的高级个性,但咱们很少在工作中用到,然而没有关系。在老我的项目中,前后端交互没有对立的数据规范,这正好是机会。
为了解决这个问题,咱们封装了对立的服务端返回类 ServerResponse
,这其中 data- 响应数据
用到了泛型,为的是适应更多的业务场景。
文章演示代码:点击跳转