Mybatis的分页插件PageHelp:Page对象中的pageSize等属性无法序列化,无法转换为json字符串

时间:2023-02-04 14:24:47

Page<User> page = new Page<>();
        User user = new User();
        user.setAge(20);
        user.setId(1);
        System.out.println(JSON.toJSONString(user));
        page.add(user);
        page.setPageNum(2);
        page.setPageSize(20);
        //Page<E> 继承了ArrayList<E>
        System.out.println(JSON.toJSONString(page));

结果:

这里使用阿里的fastjson做测试

user:{"age":20,"id":1}
page:[{"age":20,"id":1}]

分析原因:

分页对象public class Page<E> extends ArrayList<E> 继承了ArrayList集合.所以序列化Page对象时也就是在序列化一个ArrayList集合.这样的话,只会将集合中的元素E序列化出来.也不会将Page的属性pageSize,pageNum 序列化.

解决方法:

将Page<E>封装成一个对象-PageInfo.就是说将这个list封装成一个普通的java对象,而非list集合.

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
    //排序
    private String orderBy;

//由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"

//当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;

//第一页
    private int firstPage;
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
    //最后一页
    private int lastPage;

//是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;

public PageInfo() {
    }

//…

}

貌似作者已经考虑到这种情况,在Page<E>对象中实现了对PageInfo的封装.

/**
* 转换为PageInfo
*
* @return
*/
public PageInfo<E> toPageInfo() {
    PageInfo<E> pageInfo = new PageInfo<E>(this);
    return pageInfo;
}

所以:

@Test
    public void test2(){
        Page<User> page = new Page<>();
        User user = new User();
        user.setAge(20);
        user.setId(1);
        System.out.println("user:"+JSON.toJSONString(user));
        page.add(user);
        page.setPageNum(2);
        page.setPageSize(20);
        //Page<E> 继承了ArrayList<E>
        System.out.println("page:"+JSON.toJSONString(page));
        //PageInfo 对Page<E>结果进行包装
        System.out.println(JSON.toJSONString(page.toPageInfo()));
    }

结果:

user:{"age":20,"id":1}
page:[{"age":20,"id":1}]
{"endRow":0,"firstPage":1,"hasNextPage":false,"hasPreviousPage":false,"isFirstPage":true,"isLastPage":true,"lastPage":1,"list":[{"age":20,"id":1}],"navigatePages":8,"navigatepageNums":[1],"nextPage":0,"pageNum":1,"pageSize":1,"pages":1,"prePage":0,"size":1,"startRow":0,"total":1}