• 【Java】若依前后端分离,分页数据为null报错


    今天用若依开发的时候又发生了报错。

    1. 表象报错

    前端:
    在这里插入图片描述
    查看控制台:
    在这里插入图片描述
    这一看就不是前端的错误了,明显是后台返回出错了!

    后端:
    在这里插入图片描述
    很明显,后端报错空指针错误。

    2. 分析

    2.1 初步分析

    	// com.ruoyi.pdmc.controller.PdmcFormController.myApproval
        /**
         * 查询我的审批 s
         * @param id userId
         * */
        @PreAuthorize("@ss.hasPermi('pdmc:form:query')")
        @GetMapping("/myApproval")
        public TableDataInfo myApproval(Long id){
            startPage();
            List<Map<String,Object>> list = pdmcRequestService.myApproval(id);
            return getDataTable(list);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    很简单,很常用的方法。
    当然,我们此时可以在这里直接判断空,然后做业务操作(这里不展开)。
    但是如果我分页用得比较多,而且空值比较多的情况下,就需要反复对null进行判断,这一点都不酷的(code)。
    此时!
    就需要我们稍微去看一下若依的源码。

    2.2 源码分析

    List<Map<String,Object>> list = pdmcRequestService.myApproval(id);
    
    • 1

    这句话总没有什么问题,对吧
    那出问题的就是这段代码:

    return getDataTable(list);
    
    • 1

    同样的,return不会出什么错。那就是 getDataTable的问题。
    分页的问题!

    当我们定位到 BaseController中的getDataTable方法,基本就结束了。

        /**
         * 响应请求分页数据
         */
        @SuppressWarnings({ "rawtypes", "unchecked" })
        protected TableDataInfo getDataTable(List<?> list)
        {
            TableDataInfo rspData = new TableDataInfo();
            rspData.setCode(HttpStatus.SUCCESS);
            rspData.setMsg("查询成功");
            rspData.setRows(list);
            rspData.setTotal(new PageInfo(list).getTotal());
            return rspData;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    问题就出在

    rspData.setTotal(new PageInfo(list).getTotal());
    
    • 1

    3. 解决方案

        /**
         * 响应请求分页数据
         */
        @SuppressWarnings({ "rawtypes", "unchecked" })
        protected TableDataInfo getDataTable(List<?> list)
        {
            TableDataInfo rspData = new TableDataInfo();
            rspData.setCode(HttpStatus.SUCCESS);
            rspData.setMsg("查询成功");
            rspData.setRows(list);
            if (list != null){
                rspData.setTotal(new PageInfo(list).getTotal());
            }
            rspData.setTotal(0);
            return rspData;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. 后记

    其实有些问题并不难,还是多看下源码。源码也不难。没必要一碰到问题就去git上issue。然后作者问你复现的条件,你又支支吾吾说不出来。

    多看看源码,不难。

    加油,打工仔。

  • 相关阅读:
    6、规划绩效域
    java毕业设计在线教学评比平台Mybatis+系统+数据库+调试部署
    使用Navicat Premium进行Oracle数据库schema的复制
    [机器学习]-1 概要介绍
    彻底理解Linux的crontab
    【动态规划】区间动态规划
    求学之路五、六月的Review
    自动化运维管理平台TASKCTL如何在Docker安装部署
    yolo数据增强
    当前视频分析【video analytics】都有哪些痛点?为什么难以落地?
  • 原文地址:https://blog.csdn.net/liu_jiachen/article/details/127554864