SpringBoot如何设置统一返回json格式数据
这个方法也适于一般的Spring项目,只不过我目前的项目是SpringBoot为框架
我们需要将结果数据显示在前段页面上,所以我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一,是前端对数据的操作更一致、轻松,一般会包含状态码、返回消息、数据这几部分内容。
统一定义结果
{
"success":布尔,//响应是否成功
"code":数字,//响应码
"message":字符串,//返回消息
"data":HashMap//返回数据,放在键值对中
}
1、创建一个包用来存放数据结果
如果是父子工程的话,就放在一个公共的common子工程中,在common中创建一个common-utils子模块,在子模块的java文件夹下创建一个com.commonutils包(这里包名可以自定义);如果是单个工程,就在项目所在包下创建一个utils子包,用来存放数统一的据返回结果。
我的项目是单个工程,列表如下
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页面中测试这两个方法:
查询全部的方法
根据id删除的方法
可以看到两个返回结果的状态码都是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测试的结果