Swagger直接返回MybatisPlus的Page类文档不展开显示问题剖析

简介: Swagger直接返回MybatisPlus的Page类文档不展开显示问题剖析

原写法

public RestResponse<Page<RefundPageResp>> refuntList(){
}
public class RestResponse<T> {
    private Integer restCode;
    private String restMsg;
    private T restContext;
}

Page是MybatisPlus的分页查询实体com.baomidou.mybatisplus.extension.plugins.pagination.Page
Swagger文档上是这样显示的,不能展开,显然不符合需求。
在这里插入图片描述

思路

因为Page是源码不方便修改,我们先抄一个。

public class MyPage<T> {
    private List<T> records = Collections.emptyList();
    /**
     * 总数
     */
    private long total = 0;
    /**
     * 每页显示条数,默认 10
     */
    private long size = 10;
    /**
     * 当前页
     */
    private long current = 1;
    /**
     * <p>
     * SQL 排序 ASC 数组
     * </p>
     */
    private String[] ascs;
    /**
     * <p>
     * SQL 排序 DESC 数组
     * </p>
     */
    private String[] descs;
    /**
     * <p>
     * 自动优化 COUNT SQL
     * </p>
     */
    private boolean optimizeCountSql = true;
    /**
     * <p>
     * 是否进行 count 查询
     * </p>
     */
    private boolean isSearchCount = true;

    public MyPage(List<T> records, long total, long size, long current) {
        this.records = records;
        this.total = total;
        this.size = size;
        this.current = current;
    }

    public List<T> getRecords() {
        return records;
    }

    public void setRecords(List<T> records) {
        this.records = records;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public long getCurrent() {
        return current;
    }

    public void setCurrent(long current) {
        this.current = current;
    }

    public String[] getAscs() {
        return ascs;
    }

    public void setAscs(String[] ascs) {
        this.ascs = ascs;
    }

    public String[] getDescs() {
        return descs;
    }

    public void setDescs(String[] descs) {
        this.descs = descs;
    }

    public boolean isOptimizeCountSql() {
        return optimizeCountSql;
    }

    public void setOptimizeCountSql(boolean optimizeCountSql) {
        this.optimizeCountSql = optimizeCountSql;
    }

    public boolean isSearchCount() {
        return isSearchCount;
    }

    public void setSearchCount(boolean searchCount) {
        isSearchCount = searchCount;
    }

    public static <T> MyPage<T> restPage(Page<T> page) {
        return new MyPage<>(page.getRecords(), page.getTotal(), page.getSize(), page.getCurrent());
    }
}

调整后

public RestResponse<MyPage<RefundPageResp>> refuntList(){
}

无任何变化
在这里插入图片描述
我们看到isSearchCount字段应该考虑是否是其影响,is开头的属性字段是会影响字段值的存取的,我们可以看到,我自动生成的两个boolean类型的字段

public boolean isOptimizeCountSql() {
    return optimizeCountSql;
}
public void setOptimizeCountSql(boolean optimizeCountSql) {
    this.optimizeCountSql = optimizeCountSql;
}
public boolean isSearchCount() {
    return isSearchCount;
}

public void setSearchCount(boolean searchCount) {
    isSearchCount = searchCount;
}

原因

optimizeCountSql:字段类型为boolean,其get方法是isOptimizeCountSql()
然而
isSearchCount:按照原则其get方法应该为isIsSearchCount()
同理set方法应该为setIsSearchCount()
调整后

public boolean isIsSearchCount() {
    return isSearchCount;
}
public void setIsSearchCount(boolean searchCount) {
    isSearchCount = searchCount;
}

正常展开
在这里插入图片描述

最佳实践

Mybatis的查询对象Page其创建目的是为了构建查询SQL,很多字段是不需要传递给前端的,包括其他框架的分页对象也是不需要返回给前端的,我们可以构建一个自己的PageResult。

@Data
public final class PageResult<T> {
    private final Integer pageNum;
    private final Integer pageSize;
    private final Long total;
    private final List<T> list;

    private PageResult(@NotNull Integer pageNum, @NotNull Integer pageSize, @NotNull Long total, @Nullable List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
    }


    public static <T> PageResult<T> restPage(@NotNull Integer pageNum, @NotNull Integer pageSize, @NotNull Long total, @Nullable List<T> list) {
        return new PageResult<>(pageNum, pageSize, total, Optional.ofNullable(list).orElse(Collections.emptyList()));
    }

    /**
     * 将MyBatis Plus 分页结果转化为通用结果
     *
     */
    public static <T> PageResult<T> restPage(@NotNull Page<T> page) {
        return new PageResult<>(page.getPageNum(), page.getPageSize(), page.getTotal(), page.getResult());
    }

    /**
     * 将MyBatis Plus 分页结果转化为通用结果
     *
     */
    public static <T> PageResult<T> restPage(@NotNull PageInfo<T> page) {
        return new PageResult<>(page.getPageNum(), page.getPageSize(), page.getTotal(), page.getList());
    }

    /**
     * 将Jpa分页结果转化为通用结果
     */
    public static <T> PageResult<T> restPage(@NotNull org.springframework.data.domain.Page<T> page) {
        return new PageResult<>(page.getNumber()+1, page.getSize(), page.getTotalElements(), page.getContent());
    }

}
目录
相关文章
|
7月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
|
7月前
|
Oracle 关系型数据库 Java
程序员必备推荐一款与Swagger媲美的数据库文档生成工具
程序员必备推荐一款与Swagger媲美的数据库文档生成工具
78 0
|
7月前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
7月前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
|
7月前
|
数据可视化 Linux API
使用Docker安装部署Swagger Editor并远程访问编辑API文档
使用Docker安装部署Swagger Editor并远程访问编辑API文档
132 0
|
7月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
|
5月前
|
Java API 开发者
在Spring Boot中集成Swagger API文档
在Spring Boot中集成Swagger API文档
|
2月前
|
安全 Java API
SpringSecurity结合knife4j实现swagger文档
通过将Spring Security与Knife4j相结合,我们不仅能够为RESTful API提供强大的安全防护,还能保证API文档的易用性和可访问性,这对于API的设计、开发和维护来说至关重要。这种集成方式不仅提升了开发效率,也优化了API使用者的体验,是现代API驱动开发中不可或缺的一环。
87 0
|
4月前
|
JSON 测试技术 API
Python开发解析Swagger文档小工具
文章介绍了如何使用Python开发一个解析Swagger文档的小工具,该工具可以生成符合httprunner测试框架的json/yaml测试用例,同时还能输出Excel文件,以方便测试人员根据不同需求使用。文章提供了详细的开发步骤、环境配置和使用示例,并鼓励读者为该开源项目贡献代码和建议。
90 1
Python开发解析Swagger文档小工具
|
5月前
|
安全 Java API
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。
140 0
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档