【OpenAPI】Spring3 集成 OpenAPI 生成接口文档

news2024/11/18 13:57:43

Spring3 集成 OpenAPI 生成接口文档

1. 依赖

Spring 版本:3.0.5

Java 版本:jdk21

OpenAPI 依赖:

<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui -->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.6.0</version>
</dependency>

官网:OpenAPI 规范 | OpenAPI 官方文档中文版 (xiniushu.com)

不要包含其他的接口文档的框架,大概率是冲突的

目前我还没有找到 Spring3 的其他接口文档方案,swagger2 和 swagger3 都因为不兼容搞不了;

2. 配置文件

默认整个类路径全扫描

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI springOpenAPI() {
        return new OpenAPI().info(new Info()
                .title("SpringDoc API Test")
                .description("SpringDoc Simple Application Test")
                .version("1.0"));
    }

}

3. 关键用法

3.1 Tag 注解

对接口文档进行分组,一个 controller 类为单位

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
@Tag(name = "xxx")
public class xxxController {
    
}

3.2 Operation 注解

对接口进行描述,一个目标方法为单位

@PostMapping("/create")
@Operation(summary = "创建一个 XXX")
public SystemJsonResponse<CustomClass> createXXX() {
    
}

3.3 Parameter 与 Header 注解

Parameter 描述一个接口的参数与路径参数,Header 描述一个接口的请求头,他们作用于目标方法的形参

@PostMapping("/get/{id}")
@Operation(summary = "获得一个 XXX")
public SystemJsonResponse<CustomClass> getXXX(@RequestHeader("token") @Header(description = "token") String token,
                                              @PathVariable("id") @Parameter(description = "id") Long id,
                                              @RequestParam(name = "state") @Parameter(description = "state") Integer state) {
}

3.4 Schema 注解

Schema 描述一个数据模型,也可以描述一个属性,作用于类或者字段

name 可指定属性的名称,description 是属性的描述

name 作为数据模型(类)的名称,description 是数据模型(类)的描述

属性得 public 或者有 public 的 Getter 和 Setter,否则会被标注只读或只写,如果都没有则直接忽略,如果一个数据模型属性都没有,忽略这个数据模型,复杂点的情况还会出现莫名其妙的现象

总而言之规范地写就没问题,框架也没义务和精力去控制各种奇奇怪怪地情况,我们也没必要总结

@TableName(value ="user")
@Schema(description = "用户")
@Data
public class User implements Serializable {

    @Schema(description = "ID")
    private Long id;

    @Schema(description = "昵称")
    private String nickname;

    private static final long serialVersionUID = 1L;
}

3.5 SchemaProperty 注解

SchemaProperty 作用于一个字段,无法设置属性名,name 作为属性的描述

这个注解不能作用于自定义的数据模型,自定义对象会被认定为 string,因为这个注解就是作用于普通的字段,并不支持递归扫描,这个时候应该用 Schema

  • 建议都用 Schema,SchemaProperty 功能还是太弱了
@SchemaProperty(name = "ID")
private Long id;

3.6 Hidden

作用于字段,表示忽略字段

@Hidden
private String nickname;

3.7 nullable = true

注解参数设置这个代表参数可以为 null

@Schema(description = "昵称", nullable = true)
private String nickname;

3.8 响应的数据模型

OpenAPI 提供了 @ApiRespnse 注解,但是很不方便,不如直接去 Postman 或者 Apifox 上进行操作,理想状态就是直接扫描出「请求body对象」和「响应body对象」 Schema 注解描述的数据模型

请求的话,作为参数是类型是确定的,OpenAPI 框架自然是扫描的到的,但是响应的数据模型,一般是统一响应格式的:

@Schema(name = "统一响应")
@NoArgsConstructor
@Getter
public class SystemJsonResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonInclude
    @Schema(description = "状态码")
    private int code;

    @JsonInclude
    @Schema(description = "描述语")
    private String message;

    @JsonInclude
    @Schema(nullable = true)
    private Object data;
}

返回的时候,构造 json 是没问题的,但是框架扫描不出来这个 data 数据模型,因为框架只知道 data 是 Object 类型

你可能想问:“框架拿到 data 用 getClass 不就知道了吗?”

是的,但是接口文档生成是在这个接口被调用之前,所以并没有一个 data 数据提供给框架

你很容易想到用范型来定义统一响应:

@Schema(name = "统一响应")
@NoArgsConstructor
@Getter
public class SystemJsonResponse<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonInclude
    @Schema(description = "状态码")
    private int code;

    @JsonInclude
    @Schema(description = "描述语")
    private String message;

    @JsonInclude
    @Schema(nullable = true)
    private T data;
}

但是实践这个方式,你会发现生成的接口文档,data 仍然是 object

其实原因很简单,用 @Schema 将 SystemJsonResponse 描述作一个固定的数据模型,那每个以此对象为返回值的目标方法,接口文档都直接使用这个数据模型

而泛型在定义的时候,本质还是 Object

解决方案也很简单,去掉 @Schema 即可,这样框架扫描目标方法返回的 SystemJsonResponse<CustomClass> 的时候,都会创建一个新的数据模型,这个时候就可以通过泛型类型确定准确的响应数据模型了,若存在一个一模一样的才会复用

注意:

  1. 不支持通配符:SystemJsonResponse<?>
  2. SystemJsonResponse<? extends CustomClass>,则仅仅扫描 CustomClass

3.9 补充

GetMapping 的接口,RequestBody 会被扫描成 queryString,而不是 json

4. 访问

http://[host]:[post]/swagger-ui/index.html

http://[host]:[post]/v3/api-docs

在这里插入图片描述

更多细节需要去查去探索这里不一一罗列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jdk环境变量配置+eclipse配置jdk

文章目录 安装jdkjdk环境变量配置eclipse里边配置jdkeclipse覆盖率插件——EclEmma的安装和使用 安装jdk 在安装前可以先建两个文件夹&#xff0c;注意不要文件夹用英文&#xff0c;不要用中文&#xff0c;如图&#xff1a; 然后我们开始安装 然后就看我们有没有安装成功…

代码随想录day22|回溯法03

一、90.子集Ⅱ 90. 子集 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 这道题目和78.子集 (opens new window)区别就是集合里有重复元素了&#xff0c;而且求取的子集要去重。 那么关于回溯算法中的去重问题&#xff0c;在40.组合总和II (opens new window…

实际案例(7)你遇到这样的环境,如何解决?(这是一道讨论题)

服务器有两个外网的时候&#xff0c;如何都能通过外网访问服务 环境介绍&#xff1a;一个非常普通的环境&#xff0c;但是怪就怪在服务器这块&#xff0c;服务器有两个网卡&#xff0c;他本身有一个外网上网&#xff0c;这个时候客户想把这个服务器加入到防火墙的网络里面来&am…

为什么sqlynx是连接国产数据库的最佳选择?

1. 广泛的国产数据库支持 SQLynx除了国际上的主流数据库外&#xff0c;还支持多种国产数据库&#xff0c;如达梦、人大金仓、OceanBase、openGauss等。随着国产数据库市场的不断发展和成熟&#xff0c;越来越多的企业和机构开始选择国产数据库来满足其数据管理需求。SQLynx通过…

R134a制冷剂简介

目录 一、基本性质 二、环保特性 三、应用领域 1. 制冷空调行业 2. 工业制造行业 3. 气雾剂和推进剂行业 4. 发泡剂行业 5. 其他行业 四、使用注意事项 1. 安全性方面 2. 系统兼容性方面 3. 操作规范方面 4. 存储和运输方面 R134a制冷剂,也被称为四氟乙烷(CF3CH…

stm32 SPI通信外设(硬件SPI读写W25Q64)

理论 1.SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率&#xff1a; fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作…

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; class Solution { public:static const int MASK1 1 << 7;static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1;}int getBytes(int num) {if ((num & MASK1) 0) …

WhatsApp修复重大隐私漏洞,‘阅后即焚’功能安全隐患引关注

据BleepingComputer报道&#xff0c;全球拥有20亿用户的即时通讯应用WhatsApp近期修复了一个关键的隐私漏洞。该漏洞允许攻击者多次查看用户发送的“阅后即焚”&#xff08;View once&#xff09;内容。 WhatsApp的“阅后即焚”功能于三年前推出&#xff0c;允许用户发送只能查…

VSCode 渲染 markdown md , 设置插件的背景颜色 Markdown Preview Enhanced

起因&#xff0c; 目的: VSCode 中&#xff0c; 安装 Markdown Preview Enhanced 这个插件之后&#xff0c;能渲染&#xff0c;但是背景颜色太亮了。 最近正在学习 css, 所以一试身手。 先看效果&#xff1a; 过程: Ctrl Shift P 打开命令面板。输入: Markdown Preview…

【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 装了显卡后&#xff0c;开机默认是从显卡的HDMI输出&#xff0c;但这很不方便。如何让视频仍然从主板输出&#xff1f;或者说让显卡HDMI和主板…

漏洞披露-信呼-OA

更多网安漏洞复现&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/16564.html 0x01 产品简介 泛微数字化运营管理平台OA为组织提供从“可信数字身份、电子化流程审批、个性化岗位信息门户、 知识文档管理、电子化签署到内外协同的业务管理” 0x02 漏…

QT 基础学习

1> 使用绘制事件完成钟表的绘制 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QDebug> #include <QTime> #include <QTimer> #include <QDateTime> //#include <string> #includ…

发送成绩的app或小程序推荐

老师们&#xff0c;新学期的第一次月考马上开始&#xff0c;是不是还在为如何高效、便捷地发布成绩而头疼呢&#xff1f;别担心&#xff0c;都2024年了&#xff0c;我们有更智能的方式来解决这个问题&#xff01; 给大家安利一个超级实用的工具——易查分小程序。这个小程序简…

esp32-C2 对接火山引擎实现智能语音(一)

目录 一、火山引擎大模型简介 1)火山引擎网址: 2)首先需要先注册火山引擎账号 3)语音识别——即语音转为文本 一句话识别 流式语音识别 录音文件识别标准版 录音文件识别极速版 4)语音合成——文本转音频 一、火山引擎大模型简介 火山引擎的智能语音技术,基于业界先…

ORCA-3D避障算法解析

二维ORCA原理参考&#xff1a; https://zhuanlan.zhihu.com/p/669426124 ORCA原理图解 1. 找到避障速度增量 u 碰撞处理分为三种情况&#xff1a; &#xff08;1&#xff09;没有发生碰撞&#xff0c;且相对速度落在小圆里 &#xff08;2&#xff09;没有发生碰撞&#xff0…

C++---string类常见接口

介绍 string类详情>>>https://cplusplus.com/reference/string/string/?kwstring 1. string是表示字符串的字符串类&#xff08;感觉就像一个动态的字符数组&#xff09; 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作…

9月19日与MongoDB相约2024云栖大会

2024云栖大会来了&#xff01; 9月19日至9月21日 在杭州云栖小镇召开 汇集全球最新云计算和AI硬科技 MongoDB互动展区 2号馆2-8展区 MongoDB技术演讲 9月20日 分论坛&#xff1a;D2-5 2024云栖大会将设置 人工智能、计算、前沿应用三大主题馆&#xff0c; 围绕云计算与AI&#…

面试官:说说停止线程池的执行流程?

对于我们使用的线程池 ThreadPoolExecutor 来说&#xff0c;停止线程池的方法有以下两个&#xff1a; shutdown()&#xff1a;优雅的关闭线程池&#xff0c;即不再接受新任务&#xff0c;但会等待已提交任务&#xff08;包括正在执行的任务和在队列中等待的任务&#xff09;执行…

【C++高阶】解锁C++的深层魅力——探索特殊类的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 类型转换 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C特殊类 &#x1f4d2;1. 不能被拷贝…

外贸网站建设该怎么做

外贸网站已成为企业拓展国际市场、促进贸易合作的重要工具。然而&#xff0c;要想在竞争激烈的国际贸易舞台上脱颖而出&#xff0c;就需要一套科学有效的外贸网站建设方案。本文将为您介绍成功打造外贸网站的关键步骤&#xff0c;助您在数字化时代实现更广阔的国际商机。 第一步…