PageHelper的doSelectPageInfo方法自定义返回类型,今天做分页时,使用以下代码:
PageInfo<AdminVo> pageInfo = PageHelper.startPage(StringUtils.isNull(page) ? 1 : Integer.parseInt(page),StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit)).doSelectPageInfo(() -> adminService.getUserAll(userName));
本来看是没问题的,前端也没有说,但是我发现返回的数据竟然不是AdminVo,而是Admin实体类。问题就来了, 我不断打断点进行调试,发现不了问题,于是尝试其他方法。
下面的尝试就是把ServantRank对象转为ServantRankVo。
方法一:
List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(jsonObject.getString("userName"),jsonObject.getString("cardId"), jsonObject.getString("unitPosition"), jsonObject.getString("leadershipPosition"));
PageInfo<ServantRankVo> pageInfo = new PageInfo<>();
pageInfo.setPageNum(StringUtils.isNull(page) ? 1 : Integer.parseInt(page));
pageInfo.setPageSize(StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));
pageInfo1.setList(servantRankAll);
数据体没问题,内容也正确,但是个别字段不是自动算出来的,需要自己计算并set。
方法二:
PageHelper.startPage(StringUtils.isNull(page) ? 1 : Integer.parseInt(page),StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(jsonObject.getString("userName"),jsonObject.getString("cardId"), jsonObject.getString("unitPosition"), jsonObject.getString("leadershipPosition"));
PageInfo<ServantRankVo> pageInfo = new PageInfo<>(servantRankAll);
返回的仍然是ServantRank。
我开始看PageHelper的方法实现,于是设置完基础数据后得到一个Page<>对象。
接下来Page转PageInfo,这个简单啊,但是写完发现转完之后的内容有一半是ServantRank,一半是ServantRankVo。很纳闷,为什么会复制一份再转,于是继续打断点调试,最后直接清空再转。
这个是最终的代码:
Page<ServantRankVo> pageObj = PageHelper.startPage(StringUtils.isNull(page) ? 1 : Integer.parseInt(page),StringUtils.isNull(limit) ? 10 : Integer.parseInt(limit));
List<ServantRankVo> servantRankAll = servantRankService.getServantRankAll(jsonObject.getString("userName"),jsonObject.getString("cardId"),jsonObject.getString("unitPosition"),jsonObject.getString("leadershipPosition"));
pageObj.clear();
pageObj.addAll(servantRankAll);
PageInfo<ServantRankVo> pageInfo = new PageInfo<>(pageObj);
上述如果不调用pageObj.clear(); 会有两份数据,就是一半是ServantRank,一半是ServantRankVo。
先把pageObj清空,调用clear();当然你会发现不是调用的removeAll(),并且removeAll()还要让你传参数, 很纳闷removeAll()方法为什么要传参吧。可以了解一下ArrayList的removeAll()和clear()方法的区别。
于是再调用pageObj.addAll(servantRankAll);把结果集复制,最后再转,问题解决。
但是我又发现返回的PageInfo的pages参数不对,虽然前端用不到,但是抱着精益求精的想法,我就自行计算一下填入。
pageObj.setPages(total % pageSize == 0 ? total / pageSize : total / pageSize + 1);
终于写完了,但是,代码很臃肿,不利于维护阅读,更何况如果service业务较多,这块就得抽出了,那就写个工具类,方便后续其他地方也可以调用自定义参数分页。
public class PageUtils {private static final int PAGE_NUM = 1;private static final int PAGE_SIZE = 10;public static <T> PageInfo<T> getPageInfo(String page, String limit, List<T> list) {int total = list.size();int pageNum = StringUtils.isNull(page) ? PAGE_NUM : Integer.parseInt(page);int pageSize = StringUtils.isNull(limit) ? PAGE_SIZE : Integer.parseInt(limit);// 如果数据为空,则直接返回if (total == 0) {return new PageInfo<T>();}pageNum = pageNum == 0 ? PAGE_NUM : pageNum;pageSize = pageSize == 0 ? PAGE_SIZE : pageSize;// 初始化Page对象Page<T> pageObj = PageHelper.startPage(pageNum, pageSize);pageObj.clear();pageObj.addAll(list);pageObj.setTotal(total);pageObj.setPages(total % pageSize == 0 ? total / pageSize : total / pageSize + 1);return new PageInfo<T>(pageObj);}}
这个工具类优化了三次,最后是这样。其中初始化Page对象时如果前端有其他字段需求则需要自己根据情况初始化。
至此这个问题总算是解决,尝试了很多办法,前端一直都是用的PageInfo这种类型,我也不好再换数据结构,不过最终还是解决了自定义返回的问题。