ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-24 18:34:37  阅读:108  来源: 互联网

标签:通用 return 响应 static Result 公共 ok message public


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

在多年的工作以及和平时和朋友探讨中发现几乎每家公司都会有自己的项目统一返回结果对象,设计数据结构大体上都一致,只是在封装的方法及易用上略有不同,另外还存在的一个问题就是:通过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扫描代码能快速得知我们代码里可能存在的风险点及风险级别。 ↩︎

标签:通用,return,响应,static,Result,公共,ok,message,public
来源: https://blog.csdn.net/fqfa1226/article/details/122671702

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有