IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 通用公共响应结果对象设计 -> 正文阅读

[开发测试]通用公共响应结果对象设计

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

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

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:13:05  更:2022-01-28 12:15:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:30:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码