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条,所以取了前五条

相关推荐
用户37215742613522 分钟前
使用 Java 删除 Word 文档中的水印
java
艾斯比的日常22 分钟前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
空空kkk34 分钟前
MyBatis——代理Dao方式的增删改查操作
java·数据库·mybatis
T***u33336 分钟前
JavaScript在Node.js中的流处理大
开发语言·javascript·node.js
Seven9743 分钟前
线性数据结构
java
带刺的坐椅1 小时前
Solon 不依赖 Java EE 是其最有价值的设计!
java·spring·web·solon·javaee
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据分布式存储在数字媒体内容存储与版权保护中的应用
java·性能优化·区块链·分布式存储·版权保护·数字媒体·ai 识别
未来之窗软件服务1 小时前
幽冥大陆(三十四)VUE +node智慧农业电子秤读取——东方仙盟炼气期
开发语言·vue·电子秤·东方仙盟·东方仙盟sdk
踢球的打工仔1 小时前
PHP面向对象(5)
android·java·php
Rover.x1 小时前
错误:找不到或无法加载主类 @C:\Users\AppData\Local\Temp\idea_arg_file223456232
java·ide·intellij-idea