在近期针对若依框架进行开发的过程中,发现通过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中新增的方法代码如下:文章来源:https://www.toymoban.com/news/detail-597781.html
/**
* 响应请求分页数据
* 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中调用代码如下:文章来源地址https://www.toymoban.com/news/detail-597781.html
@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) {
//……数据对象封装代码……
}
到了这里,关于若依框架列表分页功能失效解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!