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

相关推荐
喵手12 小时前
玩转Java网络编程:基于Socket的服务器和客户端开发!
java·服务器·网络
再见晴天*_*13 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun082714 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge16 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘16 小时前
39.网络流入门
开发语言·网络·c++·算法
雨白17 小时前
Java 多线程指南:从基础用法到线程安全
android·java
Hungry_Shark17 小时前
IDEA版本控制管理之使用Gitee
java·gitee·intellij-idea
赛姐在努力.17 小时前
《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
java·intellij-idea
未来之窗软件服务17 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
猎板PCB黄浩17 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造