Java后端统一封装返回结果

在Java的Web编程中,总是需要返回结果的嘛,对于前后端分离的项目来说,对结果的封装尤其重要,如果不进行封装的话总是需要各种各样的返回类型,如果说统一了返回值类型的话那就只需要指定一种返回值就好了

我是这样做的,封装一个Result VO类 表示这是要给前端展示的对象,ViewObject。

里面的字段主要有

  • code 响应码 自定的
  • msg 返回消息
  • data 真实的返回的数据
  • timestamp 时间戳

然后这样完了后,还有一点需要考虑,就是这对对象需要频繁的被创建,但是有很多时候里面的数据都是空的,或者说是类似的,这个时候就需要事先创建一些对象,然后使用静态方法返回,这样就不用频繁的使用new关键字进行创建了。省去很多时间,然后呢,还有一些情况是就里面的数据不一样,响应码以及消息都是一样的所以需要再抽取一个方法然后通过参数传入变化的数据。

然后如果什么都不一样的话也是会使用new关键字进行创建,这样也很麻烦,因为每次赋值都需要写一下对象名然后使用setter进行赋值嘛。这个时候我们极其自然的想到一种设计模式那就是建造者模式,不需要使用new关键字,而且是链式编程,很是方便,而且幸运的是,在Lombok中提供了一个注解@Builder来生成该类的建造者很是方便。

至此返回结果就封装完毕了

具体如下

/**
 * @author lc
 * @date 2020-12-22 17:40
 */
@Builder
@ToString
public class ResultVO {
    /**
     * 响应码
     */
    public int code;
    /**
     * 返回的数据
     */
    public Object data;
    /**
     * 时间戳
     */
    public Date timestamp;

    /**
     * 消息
     */
    public String msg;

    public static ResultVO error() {
        return ResultVO.builder().code(20001).data(false).timestamp(new Date()).build();
    }

    public static ResultVO error(Object data) {
        return ResultVO.builder().code(20001).data(data).timestamp(new Date()).build();
    }

    public static ResultVO success() {
        return ResultVO.builder().code(20000).data(true).timestamp(new Date()).build();
    }

    public static ResultVO success(Object data) {
        return ResultVO.builder().code(20000).data(data).timestamp(new Date()).build();
    }
}xxxxxxxxxx     public static ResultVO success(Object data) {        return ResultVO.builder().code(20000).data(data).timestamp(new Date()).build();    }}/** * @author lc * @date 2020-12-22 17:40 */@Builder@ToStringpublic class ResultVO {    /**     * 响应码     */    public int code;    /**     * 返回的数据     */    public Object data;    /**     * 时间戳     */    public Date timestamp;    /**     * 消息     */    public String msg;    public static ResultVO error() {        return ResultVO.builder().code(20001).data(false).timestamp(new Date()).build();    }    public static ResultVO error(Object data) {        return ResultVO.builder().code(20001).data(data).timestamp(new Date()).build();    }    public static ResultVO success() {        return ResultVO.builder().code(20000).data(true).timestamp(new Date()).build();    }    public static ResultVO success(Object data) {        return ResultVO.builder().code(20000).data(data).timestamp(new Date()).build();    }}

但是还有一个点,那就是状态码,也就是响应码 如果改变的话,需要对每个进行方便,而且在《阿里巴巴编程规约》中不建议使用魔法值。所以我们需要在一个类中将这些状态码,封装成常量,这样如果需要改变的话只需要对这个类进行修改就好了

package com.cliong.mall.entity;

/**
 * @author lc
 * @date 2020-12-24 15:28
 */
public class ResultStatus {
    public final static int SUCCESS = 20000;
    public final static int FAIL = 20001;
}

至此,完成