若依框架列表分页功能失效解决办法

在近期针对若依框架进行开发的过程中,发现通过controller层对查询出的列表数据进行修改封装(将部分数据字段做了码值映射处理,整体条数未发生变化)后,分页功能会出现问题:查询列表的时候明明有上百条数据,但却显示total只有10条,且只有一页。经过debug分析发现主要问题存在于以下语句中:

return getDataTable(list)

这个方法来自于BaseController这个类,对应方法的具体代码如下:

    /**
     * 响应请求分页数据
     */
    @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;
    }

经过一步步debug调试分析,发现问题出现在setTotal方法中的new PageInfo(list)语句中,按照正常的处理逻辑,此处传入的list应该是Page类型的对象,但是由于我对查询的数据进行了修改封装,数据对象类型是ArrayList,因此会进入该对象的另一个分支判断,从而只计算出当前查询条件下的数据条数,并影响了后续的分页功能。PageInfo中相关的代码如下:

public PageInfo(List<T> list, int navigatePages) {
        super(list);
        this.isFirstPage = false;
        this.isLastPage = false;
        this.hasPreviousPage = false;
        this.hasNextPage = false;
        if (list instanceof Page) {
            Page page = (Page)list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.pages = page.getPages();
            this.size = page.size();
            if (this.size == 0) {
                this.startRow = 0L;
                this.endRow = 0L;
            } else {
                this.startRow = page.getStartRow() + 1L;
                this.endRow = this.startRow - 1L + (long)this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0L;
            this.endRow = list.size() > 0 ? (long)(list.size() - 1) : 0L;
        }

        if (list instanceof Collection) {
            this.calcByNavigatePages(navigatePages);
        }

    }

从网上寻找了相关的解决办法,感觉都比较复杂,为了尽可能简单地解决我的开发需求,我在BaseController类中新增了一个方法,参数中传入两个不同的对象,一个是startPage()后紧跟着的查询语句的list结果对象(实际上是Page类),另一个是我封装处理后的list对象(ArrayList类),在setTotal方法处理时传入对应的Page类,其他方法使用封装后的list类,最终达到了我需要的功能效果。

在BaseController中新增的方法代码如下:

    /**
     * 响应请求分页数据
     * list为封装后的ArrayList列表对象,list2为startPage()后得到的Page列表对象,两者数据条数需保持一致
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    protected TableDataInfo getDataTableFrom2Lists(List<?> list,List<?> list2)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list2).getTotal());
        return rspData;
    }

在业务Controller中调用代码如下:

    @GetMapping("/list")
    public TableDataInfo list(Schedule schedule) {
        startPage();
        List<Schedule> list = scheduleService.selectScheduleList(schedule);
        List<ScheduleDto> scheduleDtoList = arrange(list);
        return getDataTableFrom2Lists(scheduleDtoList,list);
    }

    private List<ScheduleDto> arrange(List<Schedule> list) {
        //……数据对象封装代码……
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值