在平时工作中,咱们写代码可能都在堆增删改查,很少有机会加上 Java 的高级个性。比方,泛型,你肯定在 Mybatis、Hibernate 这些长久化框架中用过。可轮到本人开发的时候,却发现这个货色几乎鸡肋,齐全用不上。

置信我,这种感觉很失常。因为开源框架往往要用同一套算法,来应答不同的数据结构,而 Java 的高级个性能缩小反复代码,从而进步我的项目的可维护性。

然而,咱们可能身处小公司,我的项目做完就间接交给客户了。你在最短时间实现工作就行,我的项目齐全没有保护的必要。

然而,没有关系。这次咱们来解锁泛型,用它来封装一个服务端返回类。

需要剖析

不晓得你有没有接手过一些老我的项目?那时候,SpringMVC 才刚刚进去,大家对代码标准也没概念。后果,碰上个这么不便的框架,后端开发人员就想也不想,间接把各种实体类返回给前端。

然而,工夫一久,问题就来了。

首先,数据没法保障一致性。你申请某个接口的时候,如果传入的参数不同,失去的后果必定也会不同。你看上面这个例子:

// 获取用户信息,正确返回{    "username": "jiarupc",    "nickname": "法外狂徒、张三",    "create_date": "2020-12-31 00:00:00"}// 获取用户信息,谬误返回{    "msg": "短少参数,请传入 token"}

而后,前端没法解决。你想想看,一个接口如果有时候就返回一堆用户信息,有时候又只返回一条错误信息,这得写多少 if-else 判断呀?

最初,没法团队单干。如果碰上简单的我的项目,起码也要几个人一起开发。这时候,要是返回格局没有一个规范,每个人都依照本人的想法轻易写,那我的项目迟早得乱套。

事实上,在接手一些老我的项目时,你会常常看到这种状况。业务明明不简单,但只有改了一点货色,好几个前端页面就白屏了。

这时候,如果你想基本解决问题,就必须封装对立服务端响应类。

设计-服务端响应类

服务端响应类有 2 个要点:返回值、错误码。

先来看返回值。在返回前端的时候,咱们必须要有这 3 个信息:

  1. code,响应代码;
  2. data,响应数据;
  3. msg,响应信息;

其中,咱们还要进一步设计响应代码,让它能适配更简单的环境,这里给出几个罕用的响应码,你也能够依据理论状况本人设计。

  1. 200-申请胜利
  2. 101-执行谬误
  3. 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-响应数据 用到了泛型,为的是适应更多的业务场景。

文章演示代码:点击跳转