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

背景

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

封装基本响应体

1、在 config 包里新建 ApiResponse.java

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、在控制器中使用

java 复制代码
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, "请求失败");
    }
}

这是一个非常简单的封装,如果更复杂的可以在这个基础上增加

封装分页

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

json 复制代码
{
  "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": "成功"
}
json 复制代码
{
  "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、封装

java 复制代码
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、使用

java 复制代码
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条,所以取了前五条

相关推荐
952361 分钟前
初识多线程
java·开发语言·jvm·后端·学习·多线程
m0_736914223 分钟前
服务器上pip install spacy卡住解决方法
开发语言·python
冰暮流星4 分钟前
javascript之回调函数
开发语言·前端·javascript
hongtianzai5 分钟前
Laravel9.X核心特性全解析
android·java·数据库
qq_417695056 分钟前
基于C++的区块链实现
开发语言·c++·算法
电商API_180079052478 分钟前
电商平台公开数据采集实践:基于合规接口的数据分析方案
开发语言·数据库·人工智能·数据挖掘·数据分析·网络爬虫
小陈工8 分钟前
2026年3月22日技术资讯洞察:数据库优化进入预测时代,网络安全威胁全面升级
java·开发语言·数据库·python·安全·web安全·django
小胖java9 分钟前
养老院管理系统
java·spring boot
2401_8942419210 分钟前
基于C++的反射机制探索
开发语言·c++·算法
爱丽_10 分钟前
synchronized到底锁的是什么:对象头 Mark Word、Monitor、锁升级与排查
java