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


            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}

  • 相关阅读:
    Ceph14.2.5 RBD块存储的实战配置和详细介绍,不看后悔! -- <3>
    常见SQL命令总结学习 -- <1>
    全网最详细的新手入门Mysql命令和基础,小白必看!
    全网最详细的Linux命令系列-nl命令
    全网最详细的Linux命令系列-cat命令
    全网最详细的Linux命令系列-touch命令
    全网最详细的Ceph14.2.5集群部署及配置文件详解,快来看看吧! -- <2>
    什么是Ceph存储?什么是分布式存储?简单明了带你学Ceph -- <1>
    一款专注于阅读的博客园主题-(cnblogs-theme-silence)
    Prometheus 配置文件中 metric_relabel_configs 配置--转载
  • 原文地址:https://www.cnblogs.com/a198720/p/6164442.html
Copyright © 2020-2023  润新知