01_学习springdoc的基本使用

本文介绍了Springdoc作为OpenAPI3和Springboot结合的工具,是Swagger的替代品。文中详细讲解了如何添加maven依赖,给Controller和Model加注解,以及如何处理上传附件和API排序。Springdoc支持SpringBoot2.x和3.x,提供了方便的API管理和文档展示功能。
摘要由CSDN通过智能技术生成

1 什么是 springdoc ?

  网上冲浪🏄🏻‍♂️时,无意间发现 java web 应用程序的在线接口文档,除了耳熟能详的 swagger 之外,还有个 springdoc。这也许就叫惊喜( ͡• ͜ʖ ͡• )

  还记得要使用 swagger2 的话,springboot 项目里面需要引入 springfox 的依赖。swagger2 遵循的是 OpenAPI 2 规范。现在已经有了 OpenAPI 3 规范,springdoc 便是 OpenAPI 3 和 springboot 的结合,是 springfox 的完美替代品。

  springdoc 的底层是 swagger3,前端页面看起来和 swagger2 的差不多,但无奈我是个喜新厌旧的人🙃,就是想学它~

2 springdoc 基本信息

  官网是 https://springdoc.org/ ,它不仅是官网,还是操作手册,里面说的很详细。

  需要注意的是,上面的官网是新版本 2.x 的,如果要看 1.x 版本的官网,则访问 https://springdoc.org/v1/

3 maven 依赖

3.1 version 1.7.0 及之前

  1.7.0 版本及之前的版本,支持 SpringBoot 2.x 和 Java 8,此时需要引入下面2个依赖:

<!-- springdoc 基础依赖,必须有它 -->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
    <version>1.6.14</version>
</dependency>
<!--
如果你的项目里面使用到了 spring security 的话,
需要加上springdoc 配合 spring security 的依赖
-->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-security</artifactId>
    <version>1.6.14</version>
</dependency>

  关于 springdoc 配合 spring security 的知识,目前的我对此一无所知🤣。后面再研究它吧,先把基础操作弄明白 已经搞定啦,详见文末链接。

  可以从 https://mvnrepository.com/ 里面查询到最新版,然后把 <version>1.6.14</version> 换成最新的。

3.2 新的 version 2.x 及之后

  目前(2023年10月)最新的版本 version 2.2.0,支持的是 SpringBoot 3.x 和 Java 17,此时只需需要引入一个依赖:

<!-- 2选1:使用 spring-boot-starter-web 的时候,只用下面的 webmvc-ui 的依赖 -->
<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
   <version>2.2.0</version>
</dependency>

<!-- 2选1:使用 spring-boot-starter-webflux 的时候,则用下面的 webflux-ui 的依赖 -->
<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
   <version>2.2.0</version>
</dependency>

  mvc 和 webflux 的依赖,2选1就可以。它们俩的版本号是一致的。新版本 2.x 的注解,和 1.x 的一样。

4 正文来袭

4.1 给 Controller 加注解

  主要就是下面 4 个注解:

  1. @Tag 用来设置 Controller 的名称和描述,类似于给 Postman 的 Collections 命名;
  2. @ApiResponses@ApiResponse 用来配置响应;
  3. @Operation 用来设置接口名称和描述;
  4. @Parameter 用来设置请求参数的描述、是否必填和示例。
@RestController
// 响应的 MediaType 都是 application/json
@RequestMapping(path = "/process-definition", produces = "application/json")
// Tag 注解, 给整个接口起了个名字 "流程定义", 描述是 "流程定义 API"
@Tag(name = "流程定义", description = "流程定义 API")
// ApiResponses 给每个接口提供一个默认的响应, 状态码是 200, 描述是 "接口请求成功"
@ApiResponses(@ApiResponse(responseCode = "200", description = "接口请求成功"))
public class ProcessDefinitionController {

    // Operation 注解设置了接口名称, 接口描述
    @Operation(summary = "上传 BPMN xml 字符串 并部署", description = "此接口处理的是 xml 字符串")
    @PostMapping("/upload-and-deploy/bpmn-xml-str")
    public JsonResult<?> uploadAndDeployBpmnXmlStr(@RequestBody BpmnXmlReq req) {
        return JsonResult.of(CommonCodeEnum.OK);
    }

    @Operation(summary = "查询单个 bpmn xml 数据")
    @GetMapping("/bpmn-xml")
    public JsonResult<BpmnXmlResp> findBpmnXml(
            // Parameter 注解设置了请求参数的描述, 是否必填 以及示例
            @Parameter(description = "流程部署ID", required = true, example = "1234") String deployId,
            @Parameter(description = "流程资源名称", required = true, example = "xxx.bpmn") String resourceName) {
        return JsonResult.of(CommonCodeEnum.OK, new BpmnXmlResp());
    }
}

  启动项目后,效果如下图:

图片1 在线接口文档

图1 总览

在这里插入图片描述

图2 第一个接口

在这里插入图片描述

图3 第二个接口

4.2 给 Model 加注解

@Data
// Schema 注解设置这个类的描述
@Schema(description = "bpmn xml 请求参数")
public class BpmnXmlReq {
    // Schema 注解设置每个属性的描述和示例
    @Schema(description = "bpmn文件的内容, 字符串格式", example = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
    private String xml;
    @Schema(description = "流程部署名称", example = "请假流程")
    private String deployName;
}


@Schema(description = "json结构的响应")
public class JsonResult<T> {
    @Schema(description = "状态码", example = "200")
    private Integer code;
    @Schema(description = "状态码对应的信息", example = "请求成功")
    private String message;
    @Schema(description = "给前端返回的 json 格式的内容")
    private T content;
    // 省略部分内容
}

  效果如下图:

在这里插入图片描述
  点击 Example Value 后面的 Schema 可以看到如下图的内容:

在这里插入图片描述

  滑到页面的最下方,可以看到:

在这里插入图片描述

4.3 需要上传附件怎么办?

4.3.1 错误写法

  先看下错误写法😁:

@Operation(summary = "上传 BPMN 文件并部署", description = "此接口处理的是文件流")
@PostMapping(path = "/upload-and-deploy/bpmn-file")
public JsonResult<DeploymentResp> uploadAndDeployBpmnFile(
        @Parameter(description = "要上传的 BPMN 文件", required = true) MultipartFile file,
        @Parameter(description = "流程部署的名称", required = true) @RequestParam String deployName) {
    return processDefinitionService.uploadAndDeployBpmnFile(file, deployName);
}

  效果如下:

在这里插入图片描述
  这表明,springdoc 并不能根据接口的请求参数类型是 MultipartFile ,来自动识别出我们要的是上传附件。所以解决办法就是指明此接口需要媒体类型的是附件。

4.3.2 正确写法

  代码如下,我们指明此接口消费的是 multipart/form-data 这种媒体类型。

@Operation(summary = "上传 BPMN 文件并部署", description = "此接口处理的是文件流")
@PostMapping(path = "/upload-and-deploy/bpmn-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public JsonResult<DeploymentResp> uploadAndDeployBpmnFile(
        @Parameter(description = "要上传的 BPMN 文件", required = true) MultipartFile file,
        @Parameter(description = "流程部署的名称", required = true) @RequestParam String deployName) {
    return processDefinitionService.uploadAndDeployBpmnFile(file, deployName);
}

  效果如下:

在这里插入图片描述

4.4 如何给 API 排序? 如何给 HTTP 方法排序?

  😁这个也简单~ 参考官方文档 https://springdoc.org 的 5.2 swagger-ui properties 可知,有以下2个配置项可供我们给 API 和 HTTP 方法排序:

  • springdoc.swagger-ui.tagsSorter 给 API 排序, 如果其值为 alpha 就表示按字母顺序排序。默认情况下(也就是不配置此项),API 的顺序由 swagger 自己决定(也就是没什么顺序);
  • springdoc.swagger-ui.operationsSorter 给 HTTP 方法排序,其值为 alpha 同样表示按字母顺序排序,值为 method 表示根据 HTTP 请求的类型(顺序如下:DELETE > GET > POST > PUT)排序。默认情况下,Controller 代码里面,你写的是什么顺序,swagger 就给你展示什么顺序。

4.4.1 API 排序示例

  Java 的 Controller 代码如下:

@Tag(name = "01 登录", description = "登录相关API")
public class AuthController {}

@Tag(name = "05 历史", description = "历史 API")
public class HistoryController {}

@Tag(name = "02 流程定义", description = "流程定义 API")
public class ProcessDefinitionController {}

@Tag(name = "03 流程实例", description = "流程实例 API")
public class ProcessInstanceController {}

@Tag(name = "04 任务", description = "任务 API")
public class TaskController {}

  application.yml 部分内容如下:

springdoc:
  swagger-ui:
    # API 排序
    tags-sorter: alpha

  最终效果如下图所示:

在这里插入图片描述

4.4.2 HTTP 方法排序示例

  application.yml 部分内容如下:

springdoc:
  swagger-ui:
    # API 排序
    tags-sorter: alpha
    # HTTP 方法排序
    operations-sorter: method

  最终效果如下图所示:

在这里插入图片描述

5 大功告成

  springdoc 的基本使用,到这里就全部欧克了,so easy ~

  至于它和 spring security 的配合,后续再说~

6 传送门

  1. 功夫不负有心人,😁springdoc 和 SpringSecurity 的结合,我也研究好了,文档链接如下 《02_学习springdoc与SpringSecurity配合_使用访问令牌来认证》
  2. springdoc 与微服务的结合,文档链接如下 《03_学习springdoc与微服务结合_简述》
  3. springdoc 与 oauth2 结合,文档链接如下 《04_学习springdoc与oauth结合_简述》

  感谢阅读~

1 Spring基本特征 6 2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化(简单工厂模式) 14 3.3.3初始化(创建)bean时机 15 Lazy-init初始化bean的时机拓展: 15 3.4 Bean的作用域 16 Scope单例多例作用域拓展: 16 3.4.1 singleton(默认值) 16 3.4.2 prototype 17 3.4.3 Request 17 3.4.4 Session 18 3.4.5 Global session 18 3.4.6 指定Bean的初始化方法和销毁方法 18 Bean的初始化和销毁拓展: 18 Spring的IOC总结: 20 3.5 依赖注入(DI) 20 3.5.1 使用构造器注入 20 3.5.2 使用属性setting方法进行注入 21 3.5.3 装配list集合 22 3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 3.6.2 @Qualifier 27 3.6.3 @Resource 27 3.6.4 @PostConstruct 28 3.6.5 @PreDestroy 28 注解注入拓展: 28 3.7扫描注入 30 注解扫描拓展: 32 Mvc用注解写: 34 Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理异常 96 4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 继承JdbcDaoSupport 107 5.1.6 使用properties文件 107 5.1.7 RowMapper的使用 107 拓展: 108 DataSource注入的三种方式: 108 5.1.8声明式事务管理 116 5.1.8.1Spring的事务管理器 117 5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 HibernateTemplate模板 131 5.2.2 声明式事务 131 配置XML文件 131 拓展: 132 注解形式: 137 拓展: 138 6 Struts2+spring+hibernate 141 6.1 需要添加的jar包 141 6.2 Spring融合web服务器 141 6.3 struts.xml文件 143 6.4 OpenInSessionView 143 拓展: 144 实例: 146
关于springdoc的教程,你可以在官网https://springdoc.org/上找到详细的操作手册和教程。官网提供了关于maven依赖的配置信息,你可以根据项目的需要添加相应的依赖。如果你的项目中使用spring security,还需要添加springdocspring security配合的依赖。在Spring Boot中使用springdoc非常简单,只需要引入其starter即可。它的groupId是org.springdoc,artifactId是springdoc-openapi-ui,版本号可以根据你的需求进行选择。springdocSpring生态的一个开源库,是Swagger与OpenAPI规范的具体实现。它可以帮助我们在Spring中生成API文档。虽然它不再更新,不支持Spring Boot 3及以上版本,但目前仍然是行业标准之一。如果你正在进行新项目的开发,建议使用Springdoc。 #### 引用[.reference_title] - *1* [01_学习springdoc基本使用](https://blog.csdn.net/ShiJunzhiCome/article/details/128835092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [秒懂SpringBoot之如何集成SpringDoc(全网目前最新最系统最全面的springdoc教程)](https://blog.csdn.net/ShuSheng0007/article/details/131304104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值