java:封装统一的响应体code、data、msg、paging

news2024/9/24 1:25:36

背景

我们在写接口的时候一般不会直接返回给前端数据,而是会有响应体,比如 code、data、msg,这样就有一个统一的结构方便前端处理,那么今天就来封装一个统一的响应体

封装基本响应体

1、在 config 包里新建 ApiResponse.java

package com.zhangyu.config;

import lombok.Getter;
import lombok.Setter;

public class ApiResponse<T> {
    @Getter
    @Setter
    private int code;

    @Getter
    @Setter
    private T data;

    @Getter
    @Setter
    private String msg;

    public ApiResponse(int code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    public static <T> ApiResponse<T> success (T data) {
        return new ApiResponse<>(200, data, "成功");
    }

    public static <T> ApiResponse<T> fail (int code, String msg) {
        return new ApiResponse<>(code, null, msg);
    }
}

2、在控制器中使用

package com.zhangyu.controller;

import com.zhangyu.config.ApiResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("success")
    public ApiResponse<Object> getSuccessTest() {
        JsonObject jsonObject = JsonObject.create("a", 1);
        return ApiResponse.success(jsonObject);
    }

    @GetMapping("fail")
    public ApiResponse<Object> getFailTest () {
        return ApiResponse.fail(404, "请求失败");
    }
}

在这里插入图片描述
这是一个非常简单的封装,如果更复杂的可以在这个基础上增加

封装分页

封装分页我见过两种形式的,如下:

{
  "code": 200,
  "data": {
    "list": [
      {
        "id": 1,
        "name": "张三",
        "email": "865091936@qq.com"
      },
      {
        "id": 2,
        "name": "刘能",
        "email": "xxx@xx.com"
      }
    ],
    "pageNum": 1,
    "total": 2,
    "totalPage": 1,
    "pageSize": 10
  },
  "msg": "成功"
}
{
  "code": 200,
  "data": [
    {
      "id": 1,
      "name": "张三",
      "email": "865091936@qq.com"
    },
    {
      "id": 2,
      "name": "刘能",
      "email": "xxx@xx.com"
    }
  ],
  "paging": {
    // 第几页
    "pageNum": 1,
    // 总数
    "total": 2,
    // 多少页
    "totalPage": 1,
    // 每页多少条
    "pageSize": 10
  },
  "msg": "成功"
}

这里以第二种为例
1、封装

import com.github.pagehelper.PageInfo;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 通用分页数据封装类
 */
public class CommonPage<T> {
    /**
     * 当前页码
     */
    private Integer pageNum;
    /**
     * 每页数量
     */
    private Integer pageSize;
    /**
     * 总页数
     */
    private Integer totalPage;
    /**
     * 总条数
     */
    private Long total;
    /**
     * 分页数据
     */
    private List<T> list;

    /**
     * 将PageHelper分页后的list转为分页信息
     */
    public static <T> CommonPage<T> restPage(List<T> list) {
        CommonPage<T> result = new CommonPage<T>();
        PageInfo<T> pageInfo = new PageInfo<T>(list);
        result.setTotalPage(pageInfo.getPages());
        result.setPageNum(pageInfo.getPageNum());
        result.setPageSize(pageInfo.getPageSize());
        result.setTotal(pageInfo.getTotal());
        result.setList(pageInfo.getList());
        return result;
    }

    /**
     * 将SpringData分页后的list转为分页信息
     */
    public static <T> CommonPage<T> restPage(Page<T> pageInfo) {
        CommonPage<T> result = new CommonPage<T>();
        result.setTotalPage(pageInfo.getTotalPages());
        result.setPageNum(pageInfo.getNumber());
        result.setPageSize(pageInfo.getSize());
        result.setTotal(pageInfo.getTotalElements());
        result.setList(pageInfo.getContent());
        return result;
    }

	// getter and setter
}

2、使用

public ApiResponse<Object> getAllUsersForMybatis() {
	// 使用PageHelper进行分页,第1页每页5条
    PageHelper.startPage(1, 5);
    // 获取某个数据的list
    List<UserForMybatis> userList = userMapper.findAll();
    // 获取pageInfo,也就是上面的封装
    PageInfo pageInfo = new PageInfo(userList);
    // 返回最终数据结构
    return ApiResponse.success(CommonPage.restPage(userList));
}

在这里插入图片描述

在这里插入图片描述
users 表里有 6 条数据,这里使用PageHelper进行分页,第1页每页5条,所以取了前五条

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03、pytest初体验

官方实例 # content of test_sample.py def func(x):return x 1def test_ansewer():assert func(3) 5步骤解释 [100%]指的是所有测试用例的总体进度&#xff0c;完成后&#xff0c;pytest显示一个失败报告&#xff0c;因为func(3)没有返回5 注意&#xff1a;你可以使用ass…

smartkit巡检E9000设备

https://support.huawei.com/enterprise/zh/doc/EDOC1100325140/f6eeacd6 打开链接&#xff0c;里面的内容很详细。

2023年【道路运输企业主要负责人】最新解析及道路运输企业主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人最新解析是安全生产模拟考试一点通总题库中生成的一套道路运输企业主要负责人模拟考试&#xff0c;安全生产模拟考试一点通上道路运输企业主要负责人作业手机同步练习。2023年【道路运输企业主…

继上海车展后,英信翻译再进广州车展大显身手

第二十一届广州车展于2023年11月17日-26日在广州琶洲盛大举行 &#xff0c;历时十天的展会共吸引到场观众84.7万人次&#xff0c;举办了67场新闻发布会&#xff0c;近5000家海内外媒体机构的1.2万名媒体人员参与报道了展会盛况&#xff0c;再创历史新高。本届广州车展在国内外企…

学生信息管理系统

摘 要 学生成绩管理系统是典型的信息管理系统(MIS)&#xff0c;其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。经过分析&#xff0c;我们使用Microsoft公司的C语言开发工具&#xff0c;将与C语言技术与数据库SQL2008相结合进行设计。首先&#xff0c;…

C# WPF上位机开发(图形显示软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在实际应用中&#xff0c;有一种情况就是&#xff0c;我们需要经常对数据进行图形化显示&#xff0c;这样会比较直观一点。比如经济统计里面的同比…

java每日一记 —— BeanFactory 与 ApplicationContext 的区别

BeanFactory 与 ApplicationContext 1.容器与 bean1.BeanFactory 接口2.ApplicationContext 接口 2.测试几个小案例 此篇代码在jdk11上正常运行&#xff0c;springBoot版本为2.7.14 1.容器与 bean 1.BeanFactory 接口 1.先看下源码&#xff1a; 2.从源码中的接口中可以得出…

Netty01-NIO与BIO

NIO 什么是NIO Java NIO 全称 java non-blocking IO&#xff0c;是指JDK 1.4 及以上版本提供的新API&#xff08;New IO&#xff09;。从 JDK1.4 开始&#xff0c;Java 提供了一系列改进的输入/输出的新特性&#xff0c;为所有的原始类型&#xff08;boolean类型除外&#xf…

亲测体验Go语言PGO

本文是对官方 Profile-guided optimization in Go 1.21[1] 的学习与实践. 对于PGO的思路,之前就有过类似的想法,有些许差异. 但本质都是通过对以往运行情况的"学习",优化以后程序的运行(有点以史为鉴和鉴于往事,资于治道的感觉) 过程很简单: 收集程序运行过程中的数据…

zabbix的自动发现机制:

zabbix的自动发现机制: zabbix客户端主动的和服务端联系&#xff0c;将自己的地址和端口发送给服务端&#xff0c;实现自动添加监控主机 客户端是主动的一方 缺点&#xff1b;如果自定义网段中主机数量太多&#xff0c;等级耗时会很久&#xff0c;而且这个自动发现机制不是很…

银河麒麟服务器部署Prometheus+Grafana

#年薪百万# 一、环境准备 操作系统&#xff1a;Operating System: Kylin Linux Advanced Server V10 (Sword) (X86-64) prometheus&#xff1a;prometheus-2.48.0.linux-amd64 grafana&#xff1a;grafana-enterprise-10.2.2.linux-amd64 node_exporter&#xff1a;node_expor…

个体诊所电子处方系统哪个好用,推荐一款可以自由设置配方模板能够填写病历可以查询历史病历的门诊处方笺软件

一、前言 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、中医西医均可用此软件开电子处方&#xff0c;支持病历记录查询&#xff0c;药品进出库管理&#xff0c;支持配方模板一键导入电子处方。 二、电子…

Anaconda创建虚拟环境以及Pycharm和Jupyter如何切换虚拟环境

文章目录 Anaconda创建管理虚拟环境0. 进入到终端1. 创建新环境2. 切换环境3. 删除环境4. 查询当前已有的环境 Pycharm切换虚拟环境0. 更换解析器1. 添加虚拟环境&#xff08;之前默认的是base环境&#xff09;2. 验证切换虚拟环境 Jupyter Notebook 切换虚拟环境1. 安装ipyker…

FPGA串口接收解帧、并逐帧发送有效数据——1

FPGA串口接收解帧、并逐帧发送有效数据 工程实现的功能&#xff1a;FPGA串口接收到串口调试助手发来的数据&#xff0c;将其数据解帧。判断到正确的帧头和帧尾之后&#xff0c;将有效数据存入rx_data中&#xff1b;另一方面发送端将有效数据逐帧发送出去。 参考&#xff1a;正…

嵌入式门槛高吗?

今日话题&#xff0c;嵌入式门槛高吗&#xff1f;在嵌入式领域&#xff0c;门槛因公司和职位的不同而异。普通的嵌入式岗位门槛相对较低&#xff0c;通常要求掌握一些C语言编程和单片机相关知识&#xff0c;可以制作简单的电子产品&#xff0c;但相应的工资较低。然而&#xff…

HNU-电路与电子学-未知年份(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“…

编译WSL内核,用于操作usb读卡器

wsl2默认不能操作usb读卡器&#xff0c;但是对于嵌入式linux开发来说&#xff0c;需要经常对tf卡进行操作&#xff0c;随时都会使用到usb读卡器的访问。下面讲述如何开启wsl2的usb读卡器的访问&#xff0c;主要涉及到以下2个步骤&#xff1a; wsl2本质是一个虚拟机&#xff0c…

【GO】protobuf在golang中的测试用例

上篇文章介绍了如何安装protobuf环境&#xff0c;文章链接如下 【Go】protobuf介绍及安装-CSDN博客 本节介绍protobuf在gRPC中具体如何使用&#xff0c;并编写测试用例 一、Protobuf是如何工作的 .proto文件是protobuf一个重要的文件&#xff0c;它定义了需要序列化数据的结…

Ubuntu 20.0 + mysql 8.0 用户和密码修改

第一步 下载&#xff08;简单,注意联网&#xff09;Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …

深度分析电动工具的发展趋势,盘点几个极具潜力的科技功能点

纵观市场发展规律&#xff0c;人类的每一次能源转型&#xff0c;都会带来大量红利商机&#xff0c;也会催生整个产业链的彻底革新。 一、电动工具的惊人爆发力 比如说电动工具这个大品类&#xff0c;在近两年意想不到地成为全球隐形增长冠军。主要原因在于海外市场有大量 DIY…