在平时工作中,咱们写代码可能都在堆增删改查,很少有机会加上 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-响应数据
用到了泛型,为的是适应更多的业务场景。
文章演示代码:点击跳转