全局统一返数据类型封装记录

全局统一返回值封装

​ 在Spring Boot中,实现全局统一返回值封装是一种常见的做法,它有助于保持API的一致性,并简化前端对响应数据的处理。创建一个响应体类,包含状态码、消息、数据等字段。这个类可以作为所有控制器返回值的通用格式。

​ 下面通过三种类型的统一返回响应体来实现全局统一返回值的封装!(大同小异)

​ 这里做个记录文档方便下次开发使用!!

一、返回自定义类型(常用)

1.1 封装响应状态码枚举Enum类

​ 这里的枚举类型可以自己封装。也可以使用 Hutool 工具包类中的枚举类型,针对Http响应,Hutool封装了一个类用于保存Http状态码。

​ 在Hutool工具类中, HttpStatus 是一个枚举类,它用于表示HTTP响应的状态码及其对应的描述。HttpStatus 类中定义了很多常见的HTTP状态码,如200、404、500等,并提供了方便的方法来获取状态码和描述。

  • 使用Hutool包中的枚举

    要使用Hutool的 HttpStatus ,首先确保你已经将Hutool的依赖添加到了你的项目中。如果你使用的是Maven,可以在 pom.xml 文件中添加如下依赖:

<!-- Hutool Java工具类库 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.18</version>
</dependency>

​ 直接使用Hutool工具包中的枚举类型:在这里插入图片描述

  • 自定义封装Http状态码枚举类 ResultCodeEnum
/**
 * @author: AD_Liu
 * @Description: 响应状态码
 * @ClassName: HttpStatus
 */
@Getter
public enum ResultCodeEnums {

    SUCCESS(200, "操作成功"),
    CREATED(201, "对象创建成功"),
    ACCEPTED(202, "请求已经被接受"),
    NO_CONTENT(204, "操作已经执行成功,但是没有返回数据"),
    MOVED_PERMANENTLY(301, "请求的URL已经移走"),
    SEE_OTHER(302, "请求的URL已经改变"),
    NOT_MODIFIED(304, "资源没有被修改"),
    BAD_REQUEST(400, "参数列表错误(缺少,格式不匹配)"),
    UNAUTHORIZED(401, "未授权"),
    FORBIDDEN(403, "访问受限,授权过期"),
    NOT_FOUND(404, "资源,服务未找到"),
    BAD_METHOD(405, "不支持当前请求方法"),
    CONFLICT(409, "资源冲突,或者资源被锁"),
    UNSUPPORTED_TYPE(415, "不支持的数据,媒体类型"),
    ERROR(500, "系统内部错误"),
    NOT_IMPLEMENTED(501, "接口未实现"),
    WARN(601, "系统警告");

    private final int code;
    private final String message;

    ResultCodeEnums(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

1.2 统一响应体类

PS注:需要指定响应数据data的类型

package com.ainuoshengwu.answspringboot.common;
import com.ainuoshengwu.answspringboot.common.enums.HttpStatusEnums;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
 * @ClassName : R
 * @Description : 全局响应数据结构 视图对象
 * @Author : AD
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
/** chain:支持链式编程  fluent:忽略get/set前缀 */
@Accessors(chain = true,fluent = true)
public class R<T> implements Serializable {
    /** 业务响应状态 */
    private Integer code;
    /** 响应消息:一般为请求处理失败后返回的错误提示 */
    private String msg;
    /** 响应中的数据 */
    private T data;

    /**
     * 返回成功消息
     * */
    public static R success(String msg,Object date){
        return new R(HttpStatusEnums.SUCCESS.getCode(),msg,date);
    }
    public static R success(String msg){
        return R.success(msg,null);
    }
    public static R success(Object date){
        return R.success(HttpStatusEnums.SUCCESS.getMessage(),date);
    }
    public static R success(){
        return R.success(HttpStatusEnums.SUCCESS.getMessage());
    }

    /**
     * 返回警告信息
     * */
    public static R warn(String msg,Object data) {
        return new R(HttpStatusEnums.WARN.getCode(), msg, data);
    }
    public static R warn(String msg){
        return R.warn(msg,null);
    }
    public static R warn(Object data){
        return R.warn(HttpStatusEnums.WARN.getMessage(),data);
    }
    public static R warn(){
        return R.warn(HttpStatusEnums.WARN.getMessage());
    }


    /**
     * 返回错误信息
     * */
    public static R error(String msg,Object data){
        return new R(HttpStatusEnums.ERROR.getCode(),msg,data);
    }
    public static R error(){
        return R.error(HttpStatusEnums.ERROR.getMessage(),null);
    }
    public static R error(String msg){
        return R.error(msg,null);
    }
    public static R error(int code,String msg){
        return new R(code,msg,null);
    }
}

二、返回JSONObject类型

2.1 响应体封装

package cn.zhidasifang.camundaproject.utils;
import com.alibaba.fastjson.JSONObject;
import kotlin.jvm.JvmOverloads;

/**
 * @Description: 统一返回值工具类
 * @ClassName: R
 */
public class R extends JSONObject {

    /**
    *@Description--请求操作成功!!
    *@Param [msg, resultObj]
    *@return cn.zhidasifang.camundaproject.utils.R
    */
    public static R ok(String msg,Object resultObj){
        R jsonObject = new R();
        jsonObject.put("result","ok");
        jsonObject.put("msg",msg);
        jsonObject.put("resultObj",resultObj);
        return jsonObject;
    }

    //@Overloads
    public static R ok(String msg){
        R jsonObject = new R();
        jsonObject.put("result","ok");
        jsonObject.put("msg",msg);
        jsonObject.put("resultObj",null);
        return jsonObject;
    }

    /**
    *@Description--请求错误返回数据!
    *@Param [msg, resultObj]
    *@return cn.zhidasifang.camundaproject.utils.R
    */
    public static R error(String msg,Object resultObj){
        R r = new R();
        r.put("result","error");
        r.put("msg",msg);
        r.put("resultObj",resultObj);
        return r;
    }

    /**
    *@Description--请求获取数据失败的返回参数
    *@Param [msg, resultObj]
    *@return cn.zhidasifang.camundaproject.utils.R
    */
    public static R fail(String msg,Object resultObj){
        R r = new R();
        r.put("result","fail");
        r.put("msg",msg);
        r.put("resultObj",resultObj);
        return r;
    }
}

三、返回HashMap类型(推荐使用)

3.1 响应状态码枚举类型封装

/**
 * @author: AD_Liu
 * @Description: 响应状态码
 * @ClassName: HttpStatus
 */
@Getter
public enum HttpStatusEnum {

    SUCCESS(200, "操作成功"),
    CREATED(201, "对象创建成功"),
    ACCEPTED(202, "请求已经被接受"),
    NO_CONTENT(204, "操作已经执行成功,但是没有返回数据"),
    MOVED_PERMANENTLY(301, "请求的URL已经移走"),
    SEE_OTHER(302, "请求的URL已经改变"),
    NOT_MODIFIED(304, "资源没有被修改"),
    BAD_REQUEST(400, "参数列表错误(缺少,格式不匹配)"),
    UNAUTHORIZED(401, "未授权"),
    FORBIDDEN(403, "访问受限,授权过期"),
    NOT_FOUND(404, "资源,服务未找到"),
    BAD_METHOD(405, "不支持当前请求方法"),
    CONFLICT(409, "资源冲突,或者资源被锁"),
    UNSUPPORTED_TYPE(415, "不支持的数据,媒体类型"),
    ERROR(500, "系统内部错误"),
    NOT_IMPLEMENTED(501, "接口未实现"),
    WARN(601, "系统警告");

    private final int code;
    private final String message;

    HttpStatusEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3.2 统一返回值实体类封装

import cn.hutool.core.util.ObjectUtil;
import cn.zhidasifang.common.enums.HttpStatusEnum;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Objects;

/**
 * @author: AD_Liu
 * @Description: 同一响应数据类型
 * @ClassName: ApiResult
 */
public class ApiResult<T> extends HashMap<String, Object> implements Serializable {

    /**
     * 状态码
     */
    public static final String CODE_TAG = "code";

    /**
     * 返回内容
     */
    public static final String MSG_TAG = "msg";

    /**
     * 数据对象
     */
    public static final String DATA_TAG = "data";

    /**
     * 构造器
     * */
    public ApiResult() {}
    public ApiResult(int code, String msg) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }
    public ApiResult(int code, String msg,Object data) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (ObjectUtil.isNotNull(data)) {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * 返回成功消息
     * */
    public static ApiResult success(String msg,Object date){
        return new ApiResult(HttpStatusEnum.SUCCESS.getCode(),msg,date);
    }
    public static ApiResult success(String msg){
        return ApiResult.success(msg,null);
    }
    public static ApiResult success(Object date){
        return ApiResult.success(HttpStatusEnum.SUCCESS.getMessage(),date);
    }
    public static ApiResult success(){
        return ApiResult.success(HttpStatusEnum.SUCCESS.getMessage());
    }

    /**
     * 返回警告信息
     * */
    public static ApiResult warn(String msg,Object data) {
        return new ApiResult(HttpStatusEnum.WARN.getCode(), msg, data);
    }
    public static ApiResult warn(String msg){
        return ApiResult.warn(msg,null);
    }

    /**
     * 返回错误信息
     * */
    public static ApiResult error(String msg,Object data){
        return new ApiResult(HttpStatusEnum.ERROR.getCode(),msg,data);
    }
    public static ApiResult error(){
        return ApiResult.error(HttpStatusEnum.ERROR.getMessage(),null);
    }
    public static ApiResult error(String msg){
        return ApiResult.error(msg,null);
    }
    public static ApiResult error(int code,String msg){
        return new ApiResult(code,msg,null);
    }

    /**
     * 检验消息类型
     * */
    public boolean isSuccess() {
        return Objects.equals(HttpStatusEnum.SUCCESS.getCode(), this.get(CODE_TAG));
    }

    public boolean isWarn() {
        return Objects.equals(HttpStatusEnum.WARN.getCode(), this.get(CODE_TAG));
    }

    public boolean isError(){
        return Objects.equals(HttpStatusEnum.ERROR.getCode(), this.get(CODE_TAG));
    }

    /**
     * 从写HashMap的put方法,方便链式编程
     * */
    @Override
    public ApiResult put(String key,Object value){
        super.put(key,value);
        return this;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51入门之数码管

目录 1.数码管硬件简介 1.1数码管位选 1.2数码管数选 2.静态数码管显示 3.动态数码管显示 1.数码管硬件简介 数码管&#xff0c;在我们生活中无处不在&#xff0c;红绿灯的倒计时&#xff0c;电梯的显示屏&#xff0c;还有电子表的时间显示&#xff0c;都使用了数码管的相应原…

大厂面试之【Redis持久化机制】 - RDB和AOF概述及应用配置

文章目录 Redis持久化1. RDB(Redis DataBase)1.1 概述1.2 配置应用 2. AOF(Append Only File)2.1 概述2.2 配置应用 Redis持久化 先上结论&#xff1a;Redis持久化操作分为rdb以及aof&#xff0c;但是前者已经够用 1. RDB(Redis DataBase) 1.1 概述 rdb保存的是dump.rdb文件在指…

31. UE5 RPG使用增强输入激活GameplayAbility(一)

在前面文章中&#xff0c;我们实现了对技能添加并直接激活功能&#xff0c;介绍了GA的相关参数配置。现在&#xff0c;我们还不能通过键位触发技能&#xff0c;正常在游戏时&#xff0c;我们需要通过键位触发技能&#xff0c;实现技能的激活。 在UE5里面添加了增强输入&#xf…

modprobe加载驱动模块时报错:modprobe: module xxx.ko not found in modules.dep

问题 使用modprobe时&#xff0c;报错modprobe: module xxx.ko not found in modules.dep&#xff1a; 原因 加载模块时&#xff0c;依赖没法正确添加 解决 在使用modprobe前&#xff0c;调用一下depmod指令&#xff0c;之后再用modprobe加载驱动模块 depmod modprobe interr…

使用Autodl与Xftp远程训练模型及管理远程文件

1 AutoDL网站登录创建实例 AutoDL网站:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 1&#xff09;进入算力市场&#xff0c;选取可用显卡&#xff08;工作日一般白天抢不到&#xff0c;晚上才能抢到&#xff09; 2&#xff09;选择配置环境 3&#xff09;创建成功实例…

基于ArrayList实现简单洗牌

前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…

关于hive启动的相关问题记录

问题&#xff1a;初始化hive元数据报错 [atguiguhadoop102 software]$ schematool -initSchema -dbType mysql -verboseError: Table CTLGS already exists (state42S01,code1050) Closing: 0: jdbc:mysql://hadoop102:3306/metastore?useSSLfalse org.apache.hadoop.hive.me…

数据结构和算法:十大排序

排序算法 排序算法用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定&#xff0c;如数字大小、字符 ASCII…

Linux文件管理,压缩/解压缩和vi编辑器

目录 一.linux文件管理 1.cat 2. head和tail 3.WC 4.grep 5.paste&#xff08;合并&#xff09; 二.压缩,解压缩 1.gzip bzip2 2.归档tar 3.zip 和unzip 三.vi编辑器 一.linux文件管理 1.cat 格式 &#xff1a;cat 选项 文件名 &#xff08;文件名可以是单…

哈佛大学商业评论 --- 第三篇:真实世界中的增强现实

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

代码随想录第30天|51. N皇后

51. N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 这就是传说中的N皇后&#xff1f; 回溯算法安排&#xff01;| LeetCode&#xff1a;51.N皇后_哔哩哔哩_bilibili 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行…

mysql+keepalive+lvs搭建的数据库集群实验

前提条件&#xff1a;准备5台计算机&#xff0c;且网络互通 1、客户端 yum groups -y install mariadb-client ip 192.168.0.5 2、lvs1 yum-y install ipvsadm keepalived ip 192.168.0.1 keepalivedvip 192.168.0.215 /etc/hosts 解析192.168.0.1 主机名 3、lvs2 yum-y i…

大数据实验三-HBase编程实践

目录 一&#xff0e;实验内容 二&#xff0e;实验目的 三&#xff0e;实验过程截图及说明 1、安装HBase 2、配置伪分布式模式&#xff1a; 3、使用hbase的shell命令来操作表&#xff1a; 4、使用hbase提供的javaAPI来编程实现类似操作&#xff1a; 5、实验总结及心得体会…

uniApp使用uview对vuex的二次封装实现全局变量

1、uni-app目根目录新建’/store/index.js’&#xff0c;并复制如下内容到其中 2、uni-app目根目录新建’/store/ u . m i x i n . j s ′ &#xff0c;并复制如下内容到其中&#xff0c;由于 H X 某些版本的限制&#xff0c;我们无法帮您自动引入 " u.mixin.js&#xff0…

不堪大用的pow

【题目描述】 输出100&#xff5e;999中的所有水仙花数。若3位数ABC满足&#xff0c;则称其为水仙花 数。例如&#xff0c;所以153是水仙花数。 【题目来源】 刘汝佳《算法竞赛入门经典 第2版》习题2-1 水仙花数&#xff08;daffodil&#xff09; 题目很简单&#xff0c;…

指针的偏移遍历数组--指针和数组名的区别

1.指针取地址&#xff1a;可以是数组名&#xff0c;可以是数组首地址&arr[0] 2.指针偏移完后记得回到数组首地址 #include <stdio.h>int main(){int arr[3] {1,2,3};int *p;int i;p arr; // 数组名就是数组的首地址// p &arr[0] 数组的首地址就是首个元素…

二分答案跳石头游戏

步骤&#xff1a; 输入&#xff1a; 用户输入了三个整数&#xff0c;分别表示石头的总长度l&#xff0c;石头的数量n&#xff0c;以及最多可以撤去的石头数量m。 初始化石头位置数组&#xff1a; 创建一个长度为n2的数组arr&#xff0c;用于存储每块石头的位置。数组的第一项…

FreeRTOS作业day4

1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量的数值只有0和1&#xff0c;用于共享资源的访问 计数型信号量的值一般是大于或者等于2&#xff0c;用于生产者和消费者模型 2.使用技术型信号量完成生产者和消费者模型实验。 void Sta…

使用 ChatGPT 集成精通高级 Excel(二)

原文&#xff1a;Mastering Advanced Excel - With ChatGPT Integration 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章数据透视表 介绍 数据透视表是一种基于交互式工作表的表格&#xff0c;可以快速汇总大量数据&#xff0c;使用您选择的格式和计算方法。它…