SpringBoot如何设置统一返回json格式数据

这个方法也适于一般的Spring项目,只不过我目前的项目是SpringBoot为框架

我们需要将结果数据显示在前段页面上,所以我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一,是前端对数据的操作更一致、轻松,一般会包含状态码、返回消息、数据这几部分内容。
统一定义结果

{
  "success":布尔,//响应是否成功
  "code":数字,//响应码
  "message":字符串,//返回消息
  "data":HashMap//返回数据,放在键值对中
}

1、创建一个包用来存放数据结果

如果是父子工程的话,就放在一个公共的common子工程中,在common中创建一个common-utils子模块,在子模块的java文件夹下创建一个com.commonutils包(这里包名可以自定义);如果是单个工程,就在项目所在包下创建一个utils子包,用来存放数统一的据返回结果。

我的项目是单个工程,列表如下

spring boot java 接口返回给前端json springboot怎么返回json_数据

2、创建返回状态码的接口

在utils包中创建一个ResultCode接口,用来定义返回的状态码

public interface ResultCode {

    public static Integer SUCCESS = 20000; //成功
    
    public static Integer ERROR = 20001; //失败
}

返回状态码的值可以自定义

3、定义返回数据格式

在utils包中创建一个ResultJson(类名可自定义)类,用来封装返回数据的格式

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class ResultJson {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Map<String, Object> data = new HashMap<String, Object>();

    private ResultJson() {
    }

    public static ResultJson ok() {
        ResultJson r = new ResultJson();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    public static ResultJson error() {
        ResultJson r = new ResultJson();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public ResultJson success(Boolean success) {
        this.setSuccess(success);
        return this;
    }

    public ResultJson message(String message) {
        this.setMessage(message);
        return this;
    }

    public ResultJson code(Integer code) {
        this.setCode(code);
        return this;
    }

    public ResultJson data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }

    public ResultJson data(Map<String, Object> map) {
        this.setData(map);
        return this;
    }
}

分析一下这个类: 根据返回的结果,定义对应的属性,通过类上的@data注解生成对应的get/set方法;然后把构造方法私有化(也可以不私有化),所以就不能new一个对象,只能用已有的静态方法ok和error,用来对外提供;其他值用链式编程的方法return this返回,方便使用者调用。

4、使用统一结果

以我的项目为例,修改我的EduTeacherController,现在此类中有查询全部和根据id删除的方法,是用统一返回结果后的代码是

//查询所有讲师数据
    @GetMapping("/selectAll")
    public ResultJson selectAll() {
        List<EduTeacher> list = eduTeacherService.list(null);
        System.out.println(list);
        return ResultJson.ok().data("items",list);
    }

    //根据id删除讲师数据
    @DeleteMapping("{id}")
    public ResultJson deleteById(@PathVariable String id){
        boolean result = eduTeacherService.removeById(id);
        System.out.println(result);
        if(result){
            return ResultJson.ok().message("删除成功");
        }else {
            return ResultJson.error().message("数据不存在");
        }
    }

在swagger页面中测试这两个方法:

查询全部的方法

spring boot java 接口返回给前端json springboot怎么返回json_数据_02


根据id删除的方法

spring boot java 接口返回给前端json springboot怎么返回json_java_03


可以看到两个返回结果的状态码都是20000,表示方法执行成功。

扩展方法测试:
分页查询方法

//分页查询讲师
    //current 当前页
    //limit 每页记录数
    @GetMapping("/pageTeacher/{current}/{limit}")
    public ResultJson pageListTeacher(@PathVariable long current,
                                      @PathVariable long limit) {

        //创建page对象
        Page<EduTeacher> pageTeacher = new Page<>(1,3);
        //调用方法实现分页
        //调用方法的时候,底层封装,把分页所有数据封装到pageTeacher对象里面
        eduTeacherService.page(pageTeacher,null);

        long total = pageTeacher.getTotal(); //总记录数
        List<EduTeacher> records = pageTeacher.getRecords(); //数据list集合

        /*Map map = new HashMap();
        map.put("total",total);
        map.put("rows",records);
        return ResultJson.ok().data(map);*/

        return ResultJson.ok().data("total",total).data("rows",records);
    }

返回数据可以写成第一种,将total和records放在map集合中,也可以一个一个的通过链式编程返回。

swagger测试的结果

spring boot java 接口返回给前端json springboot怎么返回json_spring boot_04