当前位置:网站首页>[SSM]统一结果封装
[SSM]统一结果封装
2022-07-22 20:34:00 【十八岁讨厌编程】
文章目录
统一结果封装
表现层与前端数据传输协议定义
SSM整合以及功能模块开发完成后,接下来,我们在上述案例的基础上分析下有哪些问题需要我们去解决下。首先第一个问题是:
在Controller层增删改返回给前端的是boolean类型数据

在Controller层查询单个返回给前端的是对象

在Controller层查询所有返回给前端的是集合对象

目前我们就已经有三种数据类型返回给前端,如果随着业务的增长,我们需要返回的数据类型会越来越多。对于前端开发人员在解析数据的时候就比较凌乱了,所以对于前端来说,如果后台能够返回一个统一的数据结果,前端在解析的时候就可以按照一种方式进行解析。开发就会变得更加简单。
所以我们就想能不能将返回结果的数据进行统一,具体如何来做,大体的思路为:
- 为了封装返回的结果数据:创建结果模型类,封装数据到data属性中
- 为了封装返回的数据是何种操作及是否操作成功:封装操作结果到code属性中
- 操作失败后为了封装返回的错误信息:封装特殊消息到message(msg)属性中

根据分析,我们可以设置统一数据返回结果类
public class Result{
private Object data;
private Integer code;
private String msg;
}
注意:Result类名及类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作。
表现层与前端数据传输协议实现
结果封装
对于结果封装,我们应该是在表现层进行处理,所以我们把结果类放在controller包下,当然你也可以放在domain包,这个都是可以的,具体如何实现结果封装,具体的步骤为:
步骤1:创建Result类
public class Result {
//描述统一格式中的数据
private Object data;
//描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败
private Integer code;
//描述统一格式中的消息,可选属性
private String msg;
public Result() {
}
//构造方法是方便对象的创建
public Result(Integer code,Object data) {
this.data = data;
this.code = code;
}
//构造方法是方便对象的创建
public Result(Integer code, Object data, String msg) {
this.data = data;
this.code = code;
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Result{" +
"data=" + data +
", code=" + code +
", msg='" + msg + '\'' +
'}';
}
}
注意:
可以不写toString方法,他最后会被被转为json格式。
但是getter和setter方法是一定要有的!
步骤2:定义返回码Code类
//状态码
public class Code {
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer GET_ERR = 20040;
}
注意:code类中的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK等。
步骤3:修改Controller类的返回值
//统一每一个控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
}
@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
Book book = bookService.getById(id);
Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
String msg = book != null ? "" : "数据查询失败,请重试!";
return new Result(code,book,msg);
}
@GetMapping
public Result getAll() {
List<Book> bookList = bookService.getAll();
Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
String msg = bookList != null ? "" : "数据查询失败,请重试!";
return new Result(code,bookList,msg);
}
}
这里拿bookList和null比较是因为,如果查询全部没有查到结果,那么就会直接返回一个null,而不是返回一个空列表!
在根据id查book的时候,如果没有查到也是返回一个null
最后我们的项目结构:
步骤4:启动服务测试

至此,我们的返回结果就已经能以一种统一的格式返回给前端。前端根据返回的结果,先从中获取code,根据code判断,如果成功则取data属性的值,如果失败,则取msg中的值做提示。
边栏推荐
- Shell script
- 网络空间拟态防御发展综述:从拟态概念到“拟态+”生态
- 国泰君安证券股票开户怎么样安全吗
- Research on security situation awareness method of Internet of things based on evidence theory
- ES6新增的class类
- 图像处理解决方案 veImageX 技术演进之路
- 用于图像语义分割的GAU与PPM
- "The time of a takeaway is not as valuable as that of a programmer": treat yourself as a person after reading a book? Power on
- [FAQ] common reasons and solutions for the failure of in app payment services to pull up the payment page
- 奇瑞艾瑞泽8产品力超能打,“全优”可不是白叫的
猜你喜欢

GNU LD脚本命令语言(二)

图像处理解决方案 veImageX 技术演进之路

奇瑞艾瑞泽8产品力超能打,“全优”可不是白叫的

GNU LD脚本命令语言(一)

Overview of the development of pseudo defense in cyberspace: from pseudo concept to "pseudo +" ecology

Flutter内存泄漏检测

Redis五大基本数据类型的基本命令

Research on security situation awareness method of Internet of things based on evidence theory

C language program environment

NFT Insider #67:巴塞罗那足球俱乐部推出首个NFT作品,迪拜推出国家元宇宙战略
随机推荐
一文理解分布式开发中的服务治理
UNO/ESP8266 for TCA9548A模块双通道驱动2块SH1106 1.3“显示
Vector3.Lerp
小程序毕设作品之微信酒店预订小程序毕业设计(8)毕业设计论文模板
小程序毕设作品之微信校园二手书交易小程序毕业设计成品(7)中期检查报告
NULL与nullptr
现货白银走势图大致是怎么样变化的?
编写一个具有搜索提示的搜索框
基于API调用管理的SDN应用层DDoS攻击防御机制
CAN总线详解
企业生产线改善毕业论文【Flexsim仿真实例】
J9数字论:什么是 Web3.0?Web3.0 有哪些特征?
[C# 数组]-C# 之中的一维数组和对象数组
小程序毕设作品之微信校园二手书交易小程序毕业设计成品(4)开题报告
rs485通信OSI模型网络层
分析伦敦银的实时行行发展方法
-bash: wget: 未找到命令
再学电商项目之谷粒商城之ES6新特性
Redis五大基本数据类型的基本命令
LAN SDN technology hard core insider - 3 prequel breaks through the bottleneck of multi-core virtualization
