springboot封装响应实体

2023-11-07

前言

首先什么是响应实体:

正常我们的后端都是接收前端,然后把请求需要的数据返回给前端,而这个返回的数据就是我们的响应实体

那么,为什么我们需要进行封装响应实体呢?

第一点,最明显的就是,为了人机友好交互,如果单单只是把返回的数据给到前端,
有数据还好,但是没有数据的情况下,前端用户使用的时候查不到数据,
怎么知道是因为什么原因没有数据呢?是因为确实查不到数据,还是因为业务逻辑卡控查不到数据,或者说代码逻辑报错

第二点的话,是为了保证类型安全性:使用泛型可以在编译时期提供类型检查,在运行时避免类型错误。通过泛型封装响应体,可以确保返回的数据类型与期望的类型一致,减少由于类型不匹配而引发的错误。

第三点,API设计:使用泛型封装响应体可以提高API的友好性和一致性。通过统一的响应体封装,客户端可以更容易地理解和使用API,并且不需要对每个响应类型进行专门处理。
在大部分的对外程序里,你如果要使用别人写的程序,调用对方的某个功能,都是看对方的API接口,看返回和请求的数据分别是什么

第四点,可复用性以及扩展性:使用泛型封装响应体可以将通用的逻辑和行为与具体的响应类型解耦,使其可以在不同的场景中复用。这种灵活性可以减少代码的重复编写,提高代码的可维护性和可扩展性。泛型封装响应体可以为不同类型的响应提供支持,而无需修改现有的代码。这种灵活性使得我们可以轻松添加新的响应类型,提供更多的选择和功能

泛型

在上面,我有反复提到泛型,那么什么是泛型?

在Java语言中,泛型是一种强类型机制,它允许在定义类、接口和方法时使用参数化类型。通过使用泛型,可以实现类型的参数化,在编译时进行类型检查,提高代码的安全性和可维护性。

说了这么多有一些空泛,那么这边给出具体的实例作为演示

这里编写了一个泛型

public class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

使用

public class GenericExample {
    public static void main(String[] args) {
        // 创建一个存储整数的Box对象
        Box<Integer> intBox = new Box<>(10);
        intBox.setValue(20); // 设置新的值
        int value = intBox.getValue(); // 取得值

        // 创建一个存储字符串的Box对象
        Box<String> stringBox = new Box<>("Hello");
        stringBox.setValue("World"); // 设置新的值
        String str = stringBox.getValue(); // 取得值
    }
}

在上述中,我们不管是使用Integer还是String类型去存储数据,都能够正常的执行
因此,泛型表现在:可接收任意的类型的数据

基础封装响应实体

以下为响应实体的代码:

public class Response<T> {
	// 状态码
    private int statusCode;
    // 响应信息提示
    private String message;
    // 响应数据
    private T data;
    
    // 构造函数
    public Response(int statusCode, String message, T data) {
        this.statusCode = statusCode;
        this.message = message;
        this.data = data;
    }
    
    // Getter和Setter方法
    
    // 状态码
    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    // 响应信息提示
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    // 响应数据
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

使用

public Response<String> Method1(String val) {
    // 执行逻辑,获取数据
    
    // 封装响应实体并返回
    return new Response<>(200, "成功", "响应数据");
}

根据你对封装的响应实体的重载方法,可编写不同的返回值

如:

return new Response<>("响应数据");
return new Response<>(200, "成功", "响应数据");
return new Response<>(200, "成功");

进阶封装响应

封装请求头和请求数据

如果你想封装为请求头和请求数据分离的形式,可编写代码如下:

public class Response<T> {

  public Header header;

  public T value;

  public Response() {
  }

  public Response(T value) {
    this.header = new Header();
    this.value = value;
  }

  public Response(int code, Exception ex) {
    if (ex.getMessage() == null) {
      this.header = new Header(code, ex.toString());
    } else {
      this.header = new Header(code, ex.getMessage());
    }
    this.value = null;
  }

  public Response(int code, String message) {
    this.header = new Header(code, message);
    this.value = null;
  }

  public Response(int code, T value, Exception ex) {
    if (ex.getMessage() == null) {
      this.header = new Header(code, ex.toString());
    } else {
      this.header = new Header(code, ex.getMessage());
    }
    this.value = value;
  }

  public Response(int code, T value, String message) {
    this.header = new Header(code, message);
    this.value = value;
  }
// 请求头,包含响应码和响应提醒信息
  public static class Header {

    public int code;

    public String message;

    public Header() {
      this.code = 0;
      this.message = "";
    }
    public Header(int code, String message) {
      this.code = code;
      this.message = message;
    }
  }
}

自定义响应码

有的时候,你不想使用默认的响应码对应的响应数据,需要根据自己的项目自定义响应码。可参考如下

定义枚举类

// 该注解需要添加lombok
@Getter
public enum ResultCode {

    SUCCESS(1000, "操作成功"),

    FAILED(1001, "响应失败"),

    VALIDATE_FAILED(1002, "参数校验失败"),

    NO_RESULT(1003, "未查询到相关信息"),

    MES_ERROR(1004, "未查询到相关信息"),

    ERROR(5000, "未知错误"),

    FILE_UPLOAD_ERROR(5001, "文件上传失败");


    private int code;
    private String msg;

    ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

响应体

@Getter
// 这两个注解可自动添加构造函数
@AllArgsConstructor
@NoArgsConstructor
public class Response<T> {
	// 响应码
    private int code;
    //	响应提示信息
    private String msg;
    // 响应数据
    private T data;

    public Response(T data) {
        this(ResultCode.SUCCESS, data);
    }

    public Response(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Response(ResultCode resultCode, T data) {
        this.code = resultCode.getCode();
        this.msg = resultCode.getMsg();
        this.data = data;
    }
}

使用

    public ResultVO Method1(){
        // 执行逻辑
        return new ResultVO(ResultCode.SUCCESS);
    }

使用对应的状态码,会返回封装的响应提示信息

结语

以上为springboot进行封装响应实体的代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot封装响应实体 的相关文章

  • 设计模式:装饰者模式

    定义 动态给一个对象添加一些额外的职责 就象在墙上刷油漆 使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活 设计初衷 通常可以使用继承来实现功能的拓展 如果这些需要拓展的功能的种类很繁多 那么势必生成很多子类 增加系统
  • Latex写文章时插入单栏图片和双栏图片方法

    环境 WinEdt7 0 前言 使用latex写文章 经常需要插入图片 有时插入的图片需要单栏排版 有时插入的图片需要双栏排版 下面汇总单双栏图片插入方法 1 单栏图片 插入单栏图片很简单 许多文章的latex模板里面都有例子 即以下代码

随机推荐

  • 【09】Nginx之缓存集成

    Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区 称作 Cache 当用户要获取数据的时候 会先从缓存中去查询获取数据 如果缓存中有就会直接返回给用户 如果缓存中没有 则会发请求从服务器重新查询数据 将数据返回给用户的同时将数据放入
  • html5 try upgrading your browser,用html5做flex的离线应用程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 HTML5 草案的前身名为 Web Application 1 0 HTML5 的目标是保持和当前 HTML 标准 HTM L4 01 以及 HTML 的 XML 版本 XHMTL1 0 向后兼
  • Javase学习必备工具,超详细的OneNote安装使用教程

    为什么要记笔记 方便回顾复习 Java的技术体系庞大 并且每天都有新内容 为了防止遗忘 建议制定有规律的复习计划 笔记是回顾复习的依据 课下自己写的练习代码应该是尝试推翻这些课堂上记录的重点结论 笔记是重要结论的集中地 记笔记在学习中起到很
  • flutter入门自定义实现PopupWindow功能

    https blog csdn net email jade article details 87922051 其实就是自定义一个weight 实现 poproute 构建一个子布局传入即可 1功能显示和隐藏 用自定义的view 2 具体操
  • Qt 5.9.6 下载及安装

    1 下载并安装 Qt 5 9 6 官网下载地址 http download qt io archive qt 5 9 5 9 6 qt opensource windows x86 5 9 6 exe 下载后安装 安装路径不能有中文字符及空
  • node读取文件转换json文件

    323 text h323 3gp video 3gpp aab application x authoware bin aam application x authoware map aas application x authoware
  • 记一次在OrangePiZero2(香橙派zero 2)上部署Redroid(云手机)的过程

    一句废话 这次换一种写作风格 尝试一下轻松的行文方式 起因 很久以前看见有群友讨论关于docker部署Redroid 拿来挂机玩游戏一类的 当时听了感觉很有意思 后面粗浅地在zero2上部署了一下 容器虽然是跑起来了 但是scrcpy连接总
  • istio流量管理

    istio 官方示例 bookinfo 配置sidecar注入 istioctl kube inject debug f samples bookinfo kube bookinfo yaml gt bookinfo2 yaml 使用kub
  • 浅谈QNX进程间通信(IPC)

    锋影 e mail 174176320 qq com 在QNX Neutrino中消息传递 Message passing 是IPC的主要形式 其他的姓氏也是基于消息传递实现的 QNX中提供的IPC形式如何下图所示 一 Synchronou
  • 基础13:惰函数

    有两种实现惰性载入的方式 第一种事函数在第一次调用时 对函数本身进行二次处理 该函数会被覆盖为符合分支条件的函数 这样对原函数的调用就不用再经过执行的分支了 我们可以用下面的方式使用惰性载入重写addEvent function addEv
  • python语言是一种面向过程的语言_浅谈编程语言中的面向过程和面向对象

    最近一直在自学Python 在 Python学习手册 的开篇有一句话 Python可以定义为面向对象的脚本语言 这句话让我十分困惑 并且在之后的一周里面让我总是混淆一些概念 到底什么是 面向对象 到底什么是 对象 带着这个疑问 我继续向下学
  • C# winform 一次只能允许一个应用(使用mutex)

    在很多应用程序开发过程中 需要只允许一个程序实例 即使是通过虚拟桌面方式连接过来的 也是只允许一个人运行 下面是实现该功能的代码 注意mutexName 为系统名称 Global为全局 表示即使通过通过虚拟桌面连接过来 也只是允许运行一次
  • verilog学习笔记(1)module实例化

    兜兜转转又回来学硬件了 哎 命啊 我的答案 有bug module top module input a input b output out wire w1 wire w2 wire w3 mod a mod a inst1 in1 w1
  • IDEA引入JDK/jar包无效、java 文件灰色右下角橙色java图标显示等问题解决办法

    一 引入jdk jar包无效 IDEA有时候会出现引入jdk无效的情况 import灰色 代码爆红 这是因为idea检测发现包并没有导入进来 1 如果是普通java项目 jdk等都配置好还是这样的话 可以通过 清除缓存并重启的方式解决 如下
  • k8s的1.20.15的kubeadm安装教程

    k8s的1 20 15的kubeadm安装教程 1 基础环境配置 1 1 配置信息 系统版本 centOS7 9 docker版本 19 03 x kubernetes 1 20 x Pod网段 172 168 0 0 16 service
  • Fiddler下载安装 Mac版

    目录 下载 安装 下载 1 进入FiddlerDownload Fiddler Web Debugging Tool for Free by Telerik下载网站 点击 Try Fiddler Everywhere 2 我这里选择的是ma
  • 【Spring Boot 初识丨一】入门实战

    学习前提 学习Spring Boot的前提是具备Java编程基础 包括面向对象编程 Java集合框架 异常处理 多线程等基本概念和技能 此外 还需要了解Web开发的基本知识 例如HTTP协议 Servlet JSP HTML CSS Jav
  • 《eNSP - OSPF 查看命令》

    display ospf peer 查看 OSPF 邻居的相关信息 display ip routing table protocol ospf 查看 OSPF 协议路由表 display ospf interface 查看运行 OSPF
  • LeetCode-二进制中1的个数

    计算机中的补数是 两个数加起来等于在二进制里一个非常整的数 比如 加起来等于 10000000000000000000000000000000000这样的 1 01 的补数 111111111111111111111111111111111
  • springboot封装响应实体

    前言 首先什么是响应实体 正常我们的后端都是接收前端 然后把请求需要的数据返回给前端 而这个返回的数据就是我们的响应实体 那么 为什么我们需要进行封装响应实体呢 第一点 最明显的就是 为了人机友好交互 如果单单只是把返回的数据给到前端 有数