spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)
一,什么情况下需要展示分页和分栏的数据的文档?
分页时,页面上展示的是同一类型的列表的数据,如图:
分栏时,每行都是一个列表,而且展示的数据类型也可能不同
这也是两种常用的数据返回形式
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,项目地址
https://github.com/liuhongdi/swagger3pagination
2,项目功能说明:
演示了分页、分栏时数据文档的展示
3,项目结构:如图:
三,配置文件说明:
1,pom.xml
<!-- swagger3 begin -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
四,java代码说明
1,Swagger3Config.java
@EnableOpenApi
@Configuration
public class Swagger3Config implements WebMvcConfigurer { @Bean
public Docket createRestApi() {
//返回文档摘要信息
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
.paths(PathSelectors.any())
.build()
.globalRequestParameters(getGlobalRequestParameters())
.globalResponses(HttpMethod.GET, getGlobalResonseMessage())
.globalResponses(HttpMethod.POST, getGlobalResonseMessage());
} //生成接口信息,包括标题、联系人等
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文档")
.description("如有疑问,请联系开发工程师老刘。")
.contact(new Contact("刘宏缔", "https://www.cnblogs.com/architectforest/", "371125307@qq.com"))
.version("1.0")
.build();
} //生成全局通用参数
private List<RequestParameter> getGlobalRequestParameters() {
List<RequestParameter> parameters = new ArrayList<>();
parameters.add(new RequestParameterBuilder()
.name("appid")
.description("平台id")
.required(true)
.in(ParameterType.QUERY)
.query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
.required(false)
.build());
parameters.add(new RequestParameterBuilder()
.name("udid")
.description("设备的唯一id")
.required(true)
.in(ParameterType.QUERY)
.query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
.required(false)
.build());
parameters.add(new RequestParameterBuilder()
.name("version")
.description("客户端的版本号")
.required(true)
.in(ParameterType.QUERY)
.query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
.required(false)
.build());
return parameters;
} //生成通用响应信息
private List<Response> getGlobalResonseMessage() {
List<Response> responseList = new ArrayList<>();
responseList.add(new ResponseBuilder().code("404").description("找不到资源").build());
return responseList;
}
}
swagger的通用配置
2,HomeController.java
@Api(tags = "首页信息管理")
@Controller
@RequestMapping("/home")
public class HomeController { @Operation(summary = "首页详情")
@GetMapping("/home")
@ResponseBody
public RestResult<PageResult<RowResult<Goods,Ad>>> home() {
//整体的返回
RestResult res = new RestResult(); //一行用到的list
List<Goods> rowList = new ArrayList();
Goods goodsone = new Goods();
goodsone.setGoodsId(3L);
goodsone.setGoodsName("电子书");
goodsone.setSubject("学python,学ai");
goodsone.setPrice(new BigDecimal(60));
goodsone.setStock(10);
rowList.add(goodsone); Goods goodstwo = new Goods();
goodstwo.setGoodsId(4L);
goodstwo.setGoodsName("蓝牙音箱");
goodstwo.setSubject("便携式音质优异");
goodstwo.setPrice(new BigDecimal(1200.00));
goodstwo.setStock(30);
rowList.add(goodstwo); //一行用到的result
RowResult oneRow = new RowResult();
oneRow.setListGoods(rowList);
oneRow.setRowType("goods"); //一行用到的list
List<Ad> rowList2 = new ArrayList();
Ad adone = new Ad();
adone.setTitle("保温杯");
adone.setImgurl("http://a.com/1.jpg");
rowList2.add(adone); Ad adtwo = new Ad();
adtwo.setTitle("茶具");
adtwo.setImgurl("http://a.com/2.jpg");
rowList2.add(adtwo); //一行用到的result
RowResult twoRow = new RowResult();
twoRow.setListAd(rowList2);
twoRow.setRowType("ad"); //一页用到的list
List<RowResult> pageList = new ArrayList();
pageList.add(oneRow);
pageList.add(twoRow); //一页用到的result
PageResult<List<RowResult>> pres= new PageResult();
pres.setList(pageList); //分页的信息
PaginationResult pares = new PaginationResult();
pares.setTotal(10);
pares.setCurrentPage(3);
pares.setPerPageCount(10);
pres.setPagination(pares); return res.success(pres);
}
}
显示分栏的分页效果
3,GoodsController.java
@Api(tags = "商品信息管理接口")
@RestController
@RequestMapping("/goods")
public class GoodsController { @Operation(summary = "分页商品列表,得到一页上多件商品的信息")
@GetMapping("/list")
public RestResult<PageResult<Goods>> list() {
//整体返回的result
RestResult res = new RestResult();
//一页中的list
List<Goods> resList = new ArrayList(); Goods goodsone = new Goods();
goodsone.setGoodsId(3L);
goodsone.setGoodsName("电子书");
goodsone.setSubject("学python,学ai");
goodsone.setPrice(new BigDecimal(60));
goodsone.setStock(10);
resList.add(goodsone); Goods goodstwo = new Goods();
goodstwo.setGoodsId(4L);
goodstwo.setGoodsName("蓝牙音箱");
goodstwo.setSubject("便携式音质优异");
goodstwo.setPrice(new BigDecimal(1200.00));
goodstwo.setStock(30);
resList.add(goodstwo); //一页的result
PageResult<List<Goods>> pres= new PageResult();
pres.setList(resList); //一页的分页信息
PaginationResult pares = new PaginationResult();
pares.setTotal(10);
pares.setCurrentPage(3);
pares.setPerPageCount(10); pres.setPagination(pares); return res.success(pres);
} @Operation(summary = "提交订单")
@PostMapping("/order")
@ApiImplicitParams({
@ApiImplicitParam(name="userid",value="用户id",dataTypeClass = Long.class, paramType = "query",example="12345"),
@ApiImplicitParam(name="goodsid",value="商品id",dataTypeClass = Integer.class, paramType = "query",example="12345"),
@ApiImplicitParam(name="mobile",value="手机号",dataTypeClass = String.class, paramType = "query",example="13866668888"),
@ApiImplicitParam(name="comment",value="发货备注",dataTypeClass = String.class, paramType = "query",example="请在情人节当天送到")
})
public RestResult<String> order(@ApiIgnore @RequestParam Map<String,String> params) {
System.out.println(params);
RestResult res = new RestResult();
return res.success("success");
}
}
分页,页面上是元素的列表
4,RestResult.java
@ApiModel("api通用返回数据")
public class RestResult<T> { //uuid,用作唯一标识符,供序列化和反序列化时检测是否一致
private static final long serialVersionUID = 7498483649536881777L;
//标识代码,0表示成功,非0表示出错
@ApiModelProperty("标识代码,0表示成功,非0表示出错")
private Integer code; //提示信息,通常供报错时使用
@ApiModelProperty("提示信息,供报错时使用")
private String msg; //正常返回时返回的数据
@ApiModelProperty("返回的数据")
private T data; //constructor
public RestResult() {
} //constructor
public RestResult(Integer status, String msg, T data) {
this.code = status;
this.msg = msg;
this.data = data;
} //返回成功数据
public RestResult success(T data) {
return new RestResult(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), data);
} public static RestResult success(Integer code,String msg) {
return new RestResult(code, msg, null);
} //返回出错数据
public static RestResult error(ResponseCode code) {
return new RestResult(code.getCode(), code.getMsg(), null);
} public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
} public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
} public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
} }
整体返回的result
5,RowResult.java
@ApiModel("每栏的信息")
public class RowResult<T,K> {
@ApiModelProperty("当前栏的类型")
private String rowType; @ApiModelProperty("当前栏的标题")
private String rowTitle; @ApiModelProperty("内容列表:商品")
private List<T> listGoods; @ApiModelProperty("内容列表:广告")
private List<K> listAd; public String getRowTitle() {
return this.rowTitle;
}
public void setRowTitle(String rowTitle) {
this.rowTitle = rowTitle;
} public String getRowType() {
return this.rowType;
}
public void setRowType(String rowType) {
this.rowType = rowType;
} public void setListGoods(List<T> listGoods) {
this.listGoods = listGoods;
}
public List<T> getListGoods() {
return this.listGoods;
} public void setListAd(List<K> listAd) {
this.listAd = listAd;
}
public List<K> getListAd() {
return this.listAd;
}
}
每行的result
6,PaginationResult.java
@ApiModel("分页信息")
public class PaginationResult { @ApiModelProperty("总页数")
private int total; @ApiModelProperty("当前第几页")
private int currentPage; @ApiModelProperty("每页的元素的数量")
private int perPageCount; public int getTotal() {
return this.total;
}
public void setTotal(int total) {
this.total = total;
} public int getCurrentPage() {
return this.currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
} public int getPerPageCount() {
return this.perPageCount;
}
public void setPerPageCount(int perPageCount) {
this.perPageCount = perPageCount;
}
}
分页信息的result
7,PageResult.java
@ApiModel("分页返回数据")
public class PageResult<T> { @ApiModelProperty("列表,分页中的数据")
private List<T> list; @ApiModelProperty("页数信息")
private PaginationResult pagination; public PageResult() {
} public void setList(List list) {
this.list = list;
}
public List<T> getList() {
return this.list;
} public void setPagination(PaginationResult pagination) {
this.pagination = pagination;
}
public PaginationResult getPagination() {
return this.pagination;
}
}
分页的result
8,Goods.java,Ad.java,ResponseCode.java
等文件可以访问github.com
五,测试效果
1,访问分页效果:
http://127.0.0.1:8080/goods/list
返回:
查看swagger:
2,查看分栏并分页的效果:访问:
http://127.0.0.1:8080/home/home
返回:
查看swagger:
六,查看spring boot的版本 :
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.3.RELEASE)
spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)的更多相关文章
- (转)WEB页面导出为Word文档后分页&横向打印的方法
<html> <HEAD> <title>WEB页面导出为Word文档后分页&横向打印的方法 </title> < ...
- 集成 Spring Doc 接口文档和 knife4j-SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 04 -集成 Spring Doc 接口文档和 knife4j 前面已经集成 MyBatis Plus.Druid 数据源,开发了 5 个接口. ...
- [Django REST framework - 自动生成接口文档、分页]
[Django REST framework - 自动生成接口文档.分页] 自动生成接口文档 # 后端人员写好接口,编写接口文档,给前端人员看,前端人员依照接口文档开发 # 公司里主流 -后端,使用w ...
- 倒排索引 获取指定单词的文档集合 使用hash去重单词term 提高数据压缩率的方法
倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inve ...
- Swagger2 生成 Spring Boot API 文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...
- spring boot☞Swagger2文档构建及单元测试
首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...
- Spring MVC 指导文档解读(一)
22.1 指导文档章节 In the Web MVC framework, each DispatcherServlet has its own WebApplicationContext, whic ...
- 0x02 Spring Cloud 学习文档
每个Spring项目都有自己的; 它详细解释了如何使用项目功能以及使用它们可以实现的功能. Spring Cloud 版本 参考文档 API文档 Finchley SR2 CURRENT GA Ref ...
- Spring学习----- Spring配置文件xml文档的schema约束
1.配置文件示例. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...
随机推荐
- 终于有人把MYSQL索引讲清楚了
一什么是索引 索引在MYSQL中也可以称为键,其是存储引擎用于快速查找记录的一种数据结构:这样听起来有点生涩,你可能难以理解:如果给你一本书,你如何能够精确的查找到书中某个章节的具体位置呢?我们肯定是 ...
- 乔悟空-CTF-i春秋-Web-SQL
2020.09.05 是不是有些题已经不能做了--费了半天,到最后发现做不出来,和网上大神的方法一样也不行,最搞笑的有个站好像是别人运营中的,bug好像被修复了-- 做题 题目 题目地址 做题 尝试简 ...
- 令人困惑的strtotime
经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌… 这不, 刚 ...
- DNS递归解析和迭代解析
DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询, 递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询.其实DNS客户端和本地名称服务器是递归,而本地名称 ...
- 小BUG大原理 | 第一篇:重写WebMvcConfigurationSupport后SpringBoot自动配置失效
一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小BUG我了解到不少未知的 ...
- three.js学习3_相机相关
Three.Camera Camera是所有相机的抽象基类, 在构建新摄像机时,应始终继承此类. 常见的相机有两种类型: PerspectiveCamera(透视摄像机)或者 Orthographic ...
- Object类:又回到最初的起点
Object类大概是每个JAVA程序员认识的第一个类,因为它是所有其他类的祖先类.在JAVA单根继承的体系下,这个类中的每个方法都显得尤为重要,因为每个类都能够调用或者重写这些方法.当你JAVA学到一 ...
- unittest培训后总结记录
今天在给同学们上了自动化测试单元框架unittest之后,突发奇想,要总结下自己今天上的课程内容.于是有了下面的一幕: 首先,今天上课的目标是要学会关于unittest框架的基本使用及断言.批量执行. ...
- 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了
各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...
- 在.NET中使用DiagnosticSource
前言 DiagnosticSource是一个非常有意思的且非常有用的API,对于这些API它们允许不同的库发送命名事件,并且它们也允许应用程序订阅这些事件并处理它们,它使我们的消费者可以在运行时动态发 ...