统一的返回值封装

45 阅读2分钟

一般来说,统一的返回值会放到公共模块,被所有模块使用,同时要求所有前端返回值都需要用这个返回值接口进行封装

@Data
public class Result<T>  implements Serializable {
    private Integer code;      // 状态码,如 200 成功,400 参数错误,500 服务异常
    private String message;    // 提示信息
    private T data;            // 业务数据
​
   // 受保护构造,允许子类调用
    protected Result() {}
​
    protected Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    // 成功:无数据
    public static <T> Result<T> success() {
        return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), null);
    }
​
    // 成功:带数据
    public static <T> Result<T> success(T data) {
        return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), data);
    }
​
    // 失败:自定义错误码和消息
    public static <T> Result<T> error(ResponseCode error) {
        return new Result<>(error.getCode(), error.getMsg(), null);
    }
​
    // 失败:通用错误
    public static <T> Result<T> error(String message) {
        return new Result<>(ResponseCode.FAIL.getCode(), message, null);
    }
​
    // 判断是否成功(可选)
    // 没有对应属性 不要加is ,否则json的反序列化会出错!!! json格式化会以为Success是一个字段
    public boolean isSuccess() {
        return this.code != null && this.code == 200;
    }
​
}
​
  1. 直接用result封装好的静态方法
   return Result.<Integer>success(count);
  1. 根据具体业务需要扩展Result的一些方法,字段,或兼容一些旧的接口返回值,或要求返回值语义更加明显如LoginResultResult<LoginInfo>更直观

如分页返回值,我们将分页开启和数据封装到Reslut方法中,解耦分页插件和具体业务的使用,替换分页插件的时候修改Reslut内的方法即可

```Java
@Data
@EqualsAndHashCode(callSuper = true)
public class PageResult<T> extends Result<PageData<T>> {
​
    protected PageResult(Integer code, String message, PageData<T> data) {
        super(code, message, data);
    }
​
​
    /**
     * 分页成功
     */
    public static <T> PageResult<T> success(List<T> list, long total) {
        PageData<T> pageData = new PageData<>(list, total);
        return new PageResult<>(200, "操作成功", pageData);
    }
​
​
    /**
     * 空分页
     */
    public static <T> PageResult<T> empty() {
        return success(java.util.Collections.emptyList(), 0);
    }
​
    /**
     * 自定义消息的分页成功
     */
    public static <T> PageResult<T> success(String message, List<T> list, long total) {
        PageData<T> pageData = new PageData<>(list, total);
        return new PageResult<>(200, message, pageData);
    }
​
    /**
     * 分页失败
     */
    public static <T> PageResult<T> error(String message) {
        return new PageResult<>(500, message, null);
    }
    
    // 开启分页 : 解耦分页插件和具体业务的使用,后续更改插件使用更方便
    public static void startPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum,pageSize);
    }
}
```