通用公共响应结果对象设计

通用公共响应结果对象设计

在多年的工作以及和平时和朋友探讨中发现几乎每家公司都会有自己的项目统一返回结果对象,设计数据结构大体上都一致,只是在封装的方法及易用上略有不同,另外还存在的一个问题就是:通过sonar扫描,绝大部分公司封装的统一响应结果对象在序列化问题上没有进行规避,这样就会导致在使用疏忽的情况下发生意想不到的问题。这里我以多年的经验设计了一个实用易用可避免序列化问题的响应结果对象。

解决的问题

  1. 使用限定泛型系列化Result<T extends Serializable>,避免适用过程中传入未序列化的对象导致序列化问题,从根本解决序列化问题。1
  2. 增加序列化的扩展字段private Serializable extend,在某些场景,我们不仅会返回结果还会返回扩展结果,这时这个字段就很有用,并且这里避免了序列化对象问题。
  3. 封装常用静态响应结果方法,使用时Result.ok(...)一行代码搞定,简单易用。

完整代码

import lombok.Data;

import java.io.Serializable;
import java.util.Collection;

/**
 * 接口公共响应对象
 * @author fay
 * @date 2022-01-24
 */
@Data
public class Result<T extends Serializable> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**请求成功标识*/
    private boolean success = true;
    /**响应码*/
    private Integer code = OK_200;
    /**响应消息*/
    private String message = OK_MSG;
    /**响应对象*/
    private T data;
    /**响应列表*/
    private Collection<T> dataList;
    /**响应扩展*/
    private Serializable extend;
    /**时间戳*/
    private long timestamp = System.currentTimeMillis();

    /**默认响应码:200成功,500失败,401无权限*/
    public static final int OK_200 = 200;
    public static final int ERROR_500 = 500;
    public static final int NO_AUTH_401 = 401;

    /**默认响应消息*/
    public static final String OK_MSG = "成功";
    public static final String ERROR_MSG = "失败";
    public static final String NO_AUTH_MSG = "无权限";

    public static <T extends Serializable> Result<T> ok() {
        return Result.ok(OK_MSG);
    }

    public static <T extends Serializable> Result<T> ok(String message) {
        return Result.ok(null, null, null, message);
    }

    public static <T extends Serializable> Result<T> ok(T data) {
        return Result.ok(data, OK_MSG);
    }

    public static <T extends Serializable> Result<T> ok(T data, String message) {
        return Result.ok(data, null, null, message);
    }

    public static <T extends Serializable> Result<T> ok(Collection<T> dataList) {
        return Result.ok(dataList, OK_MSG);
    }

    public static <T extends Serializable> Result<T> ok(Collection<T> dataList, String message) {
        return Result.ok(null, dataList, null, message);
    }

    public static <T extends Serializable> Result<T> ok(T data, Serializable extend) {
        return Result.ok(data, null, extend, OK_MSG);
    }

    public static <T extends Serializable> Result<T> ok(Collection<T> dataList, Serializable extend) {
        return Result.ok(null, dataList, extend, OK_MSG);
    }

    public static <T extends Serializable> Result<T> error() {
        return Result.error(ERROR_MSG);
    }

    public static <T extends Serializable> Result<T> error(String message) {
        return Result.error(ERROR_500, message);
    }

    public static <T extends Serializable> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<>();
        result.code = code;
        result.message = message;
        result.success = false;
        return result;
    }

    /**
     * 无权访问
     */
    public static <T extends Serializable> Result<T> noAuth() {
        return Result.error(NO_AUTH_401, NO_AUTH_MSG);
    }

    private static <T extends Serializable> Result<T> ok(T data, Collection<T> dataList,
                                                         Serializable extend, String message) {
        Result<T> result = new Result<>();
        result.code = OK_200;
        result.data = data;
        result.dataList = dataList;
        result.extend = extend;
        result.message = message;
        return result;
    }
}

  1. 使用sonar扫描代码能快速得知我们代码里可能存在的风险点及风险级别。 ↩︎

上一篇:Spark yarn问题解决:exited with exitCode: -1000 或 Resource * changed on src filesystem (expected *, was *


下一篇:我理解的正则表达式