首页 > 其他分享 >7. 统一结果封装

7. 统一结果封装

时间:2023-07-02 21:47:20浏览次数:28  
标签:code 封装 结果 Result msg Integer data public 统一

1. 表现层与前端数据传输协议定义

SSM 整合以及功能模块开发完成后,接下来,我们在上述案例的基础上分析下有哪些问题需要我们去解决下。首先第一个问题是:

  • 在 Controller 层增删改返回给前端的是 boolean 类型数据

    image

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

    image

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

    image

目前我们就已经有三种数据类型返回给前端,如果随着业务的增长,我们需要返回的数据类型会越来越多。对于前端开发人员在解析数据的时候就比较凌乱了,所以对于前端来说,如果后台能够返回一个统一的数据结果,前端在解析的时候就可以按照一种方式进行解析。开发就会变得更加简单。

所以我们就想能不能将返回结果的数据进行统一,具体如何来做,大体的思路为:

  • 为了封装返回的结果数据:创建结果模型类,封装数据到 data 属性中
  • 为了封装返回的数据是何种操作及是否操作成功:封装操作结果到 code 属性中
  • 操作失败后为了封装返回的错误信息:封装特殊消息到 message(msg)属性中

image

据分析,我们可以设置统一数据返回结果类

public class Result {
    private Object data;
    private Integer code;
    private String msg;
}

注意:Result 类名及类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作。

2. 表现层与前端数据传输协议实现

2.1 结果封装

对于结果封装,我们应该是在表现层进行处理,所以我们把结果类放在 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 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 + '\'' +
                '}';
    }
}

步骤 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);
    }
}

步骤 4:启动服务测试

image

标签:code,封装,结果,Result,msg,Integer,data,public,统一
From: https://www.cnblogs.com/NorthPoet/p/17521463.html

相关文章

  • 开心档之C++ 数据封装
    C++数据封装所有的C++程序都有以下两个基本要素:**程序语句(代码):**这是程序中执行动作的部分,它们被称为函数。**程序数据:**数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确......
  • 封装,重写
    封装,重写封装该露的露,该藏的藏我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。封装(数据的隐藏)通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。记住......
  • Vue封装组件并发布到npm仓库
    前言使用Vue框架进行开发,组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用,比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同,开发人员还是得必须封装自己得组件,如果换了一个......
  • 空和0造成的Sumifs的错误结果
    问题:某个条件区域为空,直接使用Sumifs的结果错误。解决:H2单元格连接空文本=SUMIFS(C:C,A:A,G2,B:B,H2&"")绝大多数情况下,空单元格被引用后返回的结果是0,但作为Sumif这类函数的条件区域参数,默认为非数值,即空文本,这时就可以将相应的条件转成文本型数字。这一转换不会影响条......
  • 构建云上和云下统一的安全方案,华为云致力为企业降本增效
    在云计算的时代,企业的业务系统已经不再局限于单一的环境,而是跨越了云端和本地,形成了云上云下的部署模式。然而,这种模式带来的是安全防护的挑战,企业需要在云上云下都实现安全防护,同时还要降低运营成本。面对这种挑战,华为云提出了云上云下一体化的解决方案,打造统一、高效的安全管理平......
  • vue中封装服务器地址/接口与设置请求头
    设置请求头首先创建一个放置服务器地址的js,如http.js,然后在http.js中引入axiosimportaxiosfrom"axios";如果没有axios,需要先安装,npmiaxios或者yarnaddaxois,然后重启服务器...直接上代码点击查看代码importaxiosfrom"axios";//导入axios//创建请求实......
  • ERP项目中常用的返回结果集类
    packagecom.itheima.reggie.utils;importjava.util.HashMap;importjava.util.Map;importlombok.Data;/****@param<T>*/@DatapublicclassR<T>{privateIntegercode;privateStringmsg;privateTdata;......
  • python执行终端命令并获得输出结果
    兼容windows和linux的终端执行函数defshell_exec(cmd:str)->str:  """ 执行终端命令,输出终端打印结果 :paramcmd: :return: """  withos.popen(cmd)asfp:    bf=fp._stream.buffer.read()  out=bf.decode().strip()  retu......
  • [代码]使用LINQ的查询结果填充XML树(LINQ to XML)
    此代码使用的是LINQtoXML的函数构造功能创建一个XML树,其中树中的一些元素是通过LINQ查询结果填充。实际上,通过本例也可以看到如何使用LINQtoXML将原始XML文档转换成为另外一种XML文档。下面代码中使用的PurchaseOrder.xml文档内容:<?xmlversion="1.0"?><PurchaseOrderPurchas......
  • 统一移动门户对政企级办公来说有哪些优势?
    政府机构和企业在数字化转型后,内部常使用多套不同的信息系统和应用程序。然而,这些系统和应用之间存在信息和数据隔离的问题,导致内部员工需要频繁切换登录,并容易出现信息遗漏和处理延误。这不仅妨碍了工作效率的提升,也影响了政府机构和企业的数字化转型步伐。那么想要解决这些问题,可......