Swagger升级指南:Swagger2与Swagger3注解差异揭秘

在API开发的世界里,Swagger已经成为了一个不可或缺的工具,它让API的文档化和前后端的协作变得前所未有地简单。随着Swagger的进化,我们迎来了Swagger3,也被称为OpenAPI Specification 3.0。本篇博客将带大家深入了解Swagger2和Swagger3(OpenAPI 3)之间的主要区别,特别是在注解上的变化,并且提供一些实用的Java示例,帮助大家平滑过渡到Swagger的新时代。

引言

随着RESTful API的普及,API文档成为了开发过程中的一个重要组成部分。Swagger作为API文档的领先工具,提供了一种标准化的方法来设计、构建、文档化以及使用REST API。Swagger2长期以来一直是开发者的首选,但随着Swagger3的出现,很多开发者面临着升级的选择。本文旨在帮助你理解两个版本之间的差异,并通过示例指导如何迁移。

Swagger简介

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体来说,Swagger提供了一套标准的注解,开发者可以通过这些注解来描述他们的API,然后Swagger可以根据这些注解生成可交互的API文档。

Swagger2与Swagger3的核心区别

Swagger3是在Swagger2的基础上进行了改进和扩展,它实现了OpenAPI Specification 3.0,这个最新版本的规范带来了许多新特性和改进,如对回调、链式操作、组件重用等支持。

注解对比

通用注解变化

在Swagger3中,一些基本注解发生了变化。例如,@Api注解在Swagger3中被弃用,因为Swagger3鼓励使用更自然的方式来组织API文档。

API信息配置

在Swagger2中,你可能习惯了使用@Api注解和Docket配置API的基本信息。而在Swagger3中,这些信息通常在OpenAPI配置类中通过构建OpenAPI实例来设置。

路径和操作注解

Swagger2的@ApiOperation@ApiImplicitParam@ApiImplicitParams注解在Swagger3中被@Operation@Parameter注解替代,提供了更多的配置选项和更好的可读性。

参数注解

Swagger3引入了@Parameter注解来描述参数,它提供了更多的属性来定义参数的元数据,如schemaexamplecontent等。

模型注解

Swagger3通过使用@Schema注解来描述数据模型,这是一个强大的注解,它提供了对模型定义的完全控制。

实践:从Swagger2迁移到Swagger3

迁移过程中,你需要注意替换过时的注解,并且调整配置类以适应新的OpenAPI 3.0结构。这通常涉及到替换Docket配置以及重构现有的注解。

代码示例

让我们看一下在Swagger2和Swagger3中如何配置API信息和使用注解。

Swagger2配置示例

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example"))
                .build()
                .apiInfo(new ApiInfoBuilder()
                        .title("My API")
                        .description("API Description")
                        .version("1.0")
                        .build());
    }
}

Swagger3配置示例

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {
    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
                .group("spring")
                .packagesToScan("com.example")
                .build();
    }

    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("My API")
                        .description("API Description")
                        .version("v2.0"));
    }
}

在上面的Swagger3配置中,我们使用了GroupedOpenApi来创建API组,并且使用了OpenAPI类来构建API的元信息。

Swagger2与Swagger3注解的主要区别

Swagger3基于OpenAPI Specification 3.0,这个新版本的规范带来了更多的灵活性和表达力。以下是Swagger2和Swagger3注解的一些主要区别:

通用注解

  • Swagger2: 使用@Api来注解控制器类,表明该类的路径应该被Swagger文档化。
  • Swagger3: 不再需要@Api注解。Swagger3使用更自然的方式来扫描类路径,自动包含所有的控制器。

API信息和描述

  • Swagger2: 通过@ApiInfo@ApiOperation注解来提供API的信息和操作描述。
  • Swagger3: 使用@Tag注解来替代@Api,并且通过@Operation注解来提供操作的描述。

路径和操作注解

  • Swagger2: 使用@ApiOperation来描述一个HTTP操作,@ApiImplicitParam@ApiImplicitParams用于描述参数。
  • Swagger3: 引入了@Operation注解来描述HTTP操作,@Parameter注解用于描述参数。

参数注解

  • Swagger2: 参数注解是通过@ApiParam@ApiImplicitParam来描述。
  • Swagger3: 使用@Parameter注解来描述参数,它提供了更丰富的属性,如schemaexamplecontent

请求体和响应体注解

  • Swagger2: 使用@ApiModel@ApiModelProperty注解来描述请求和响应的数据模型。
  • Swagger3: 引入了@Schema注解来描述数据模型,提供了更多的细节和配置选项。

安全和授权注解

  • Swagger2: 使用@ApiResponses@ApiResponse@ApiOperation等注解来描述响应和错误码。
  • Swagger3: @ApiResponse注解仍然存在,但是现在可以包含更多的信息,如媒体类型和例子。

详细注解对比

下面我们将详细比较这些注解在Swagger2和Swagger3中的具体使用和区别。

API信息配置

Swagger2
// Swagger2 使用Docket进行配置
@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo());
}

private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
            .title("My API")
            .description("API Description")
            .version("1.0")
            .build();
}
Swagger3
// Swagger3 使用OpenAPI进行配置
@Bean
public OpenAPI customOpenAPI() {
    return new OpenAPI()
            .info(new Info()
                .title("My API")
                .version("2.0")
                .description("API Description")
                .termsOfService("http://swagger.io/terms/")
                .license(new License().name("Apache 2.0").url("http://springdoc.org")));
}

路径和操作注解

Swagger2
@Api(value = "User Management", description = "Operations pertaining to users")
@RestController
@RequestMapping("/users")
public class UserController {

    @ApiOperation(value = "Get a user by ID")
    @RequestMapping(value = "/{userId}", method = RequestMethod.GET)
    public User getUserById(@PathVariable Long userId) {
        // ...
    }
}
Swagger3
@Tag(name = "User Management", description = "Operations pertaining to users")
@RestController
@RequestMapping("/users")
public class UserController {

    @Operation(summary = "Get a user by ID")
    @GetMapping("/{userId}")
    public User getUserById(@PathVariable Long userId) {
        // ...
    }
}

参数注解

Swagger2
public User getUserById(@ApiParam(value = "ID of the user to return", required = true) @PathVariable Long userId) {
    // ...
}
Swagger3
public User getUserById(@Parameter(description = "ID of the user to return", required = true) @PathVariable Long userId) {
    // ...
}

请求体和响应体注解

Swagger2
@ApiModel(description = "User object")
public class User {

    @ApiModelProperty(notes = "The database generated user ID")
    private Long id;

    // ...
}
Swagger3
@Schema(description = "User object")
public class User {

    @Schema(description = "The database generated user ID")
    private Long id;

    // ...
}

安全和授权注解

Swagger2
@ApiOperation(value = "Add a new user", authorizations = {
    @Authorization(value = "apiKey")
})
Swagger3
@Operation(summary = "Add a new user", security = {
    @SecurityRequirement(name = "apiKey")
})

总结

Swagger3(OpenAPI 3)是对Swagger2的一个重大升级,它不仅提供了更多的新特性,也带来了注解的变化。虽然迁移可能需要一些工作,但新的规范和特性是值得的。本文提供了一个基础的迁移指南和注解对比,帮助大家理解如何从Swagger2迁移到Swagger3,并利用它来更好地文档化API。

👉 💐🌸 公众号请关注 "果酱桑", 一起学习,一起进步! 🌸


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swagger不显示接口注释

如果 Swagger 不显示接口注释,请检查以下两点: 1、缺少 XML 注释文件:Swagger 默认使用 XML 注释文件中的注释来生成接口文档。确保在项目的生成设置中启用了 XML 文档生成,并将生成的 XML 注释文件放置在与生成的 DLL 文件相同的…

计算机组成原理(复习题)

更多复习详情请见屌丝笔记 一、选择题 计算机系统概述 1、至今为止,计算机中的所有信息仍以二进制方式表示的理由是( C )。 A.运算速度快 B.信息处理方便 C.物理器件性能所致 D.节约元件 2、运算器的核心功能部件是( D &am…

快速入门 — — 在Moonbeam上开发

访问熟悉的以太坊工具是一回事,获得顶级支持、拥有构建突破性跨链应用程序的资源是另一回事。 Moonbeam汇集了通过集成互操作性解决方案访问任何链的能力、具有完全以太坊兼容性的理想开发环境,以及使用Substrate在波卡上安全扩展的能力。 开始在Moonb…

Kafka为什么能高效读写数据

1)Kafka 本身是分布式集群,可以采用分区技术,并行度高(生产消费方并行度高); 2)读数据采用稀疏索引,可以快速定位要消费的数据; 3)顺序写磁盘; …

行业追踪,2023-12-20

自动复盘 2023-12-20 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

构建陪诊预约系统:技术实现与用户体验

在医疗服务不断创新的背景下,陪诊预约系统作为一种结合技术与人性化服务的应用,为患者提供了更为便捷和贴心的医疗体验。让我们通过简单的示例代码,了解一下如何构建一个基本的陪诊预约系统。 技术栈选择 在开始构建陪诊预约系统之前&…

蓝牙物联网开发与应用:五大核心应用场景!

蓝牙技术在物联网中的五大核心应用场景 1、智能家居 通过蓝牙连接智能家居设备,如智能灯泡、智能插座、智能恒温器等,可以实现远程控制、语音控制等功能,提高家居的智能化程度和便利性。 2、智能穿戴设备 蓝牙技术可以连接智能手表、智能手…

倒计数器:CountDownLatch

CountDownLatch 是 Java 中用于多线程编程的一个同步工具。 它允许一个或多个线程等待其他线程执行完特定操作后再继续执行。 CountDownLatch 通过一个计数器来实现, 该计数器初始化为一个正整数,每当一个线程完成了指定操作,计数器就会减一。…

MyBatis进行CRUD中添加数据实现主键回填

文章目录 MyBatis进行CRUD中添加数据实现主键回填1、创建一个mybatis项目2、实现添加数据时主键回填在MyBatisTest.java中添加下面方法在UserMapper.java中添加对应的属性在UserMapper.xml中添加sql语句如下运行结果如下(取消commit方法注释后就不会出现Rolling back回滚进行真…

谈思生物医疗直播|“靶向双硫死亡在肿瘤治疗中的应用”

细胞死亡是维持生物发育和内部环境稳态的生理过程。靶向细胞死亡相关通路杀死癌细胞是癌症治疗的一大方向。今年年初,有研究团队发现和鉴定了一种全新的细胞死亡类型——双硫死亡(Disulfidptosis),为癌治疗开辟了新的可能性。 溶质载体家族成员 SLC7A11…

求奇数的和 C语言xdoj147

题目描述:计算给定一组整数中奇数的和,直到遇到0时结束。 输入格式:共一行,输入一组整数,以空格分隔 输出格式:输出一个整数 示例: 输入:1 2 3 4 5 0 6 7 输出:9 #inclu…

QEMU源码全解析 —— virtio(19)

接前一篇文章: 上回书继续讲解virtio_pci_driver的probe回调函数virtio_pci_probe(),在讲到第5段代码的时候, if (force_legacy) {rc virtio_pci_legacy_probe(vp_dev);/* Also try modern mode if we cant map BAR0 (no IO space). */if (r…

Java如何开发PC客户端(Windows,Mac,Linux)

项目编译工具:Gradle开发工具: Idea开发语言: 建议java17以上ui组件:openjfx (org.openjfx.javafxplugin)打包工具: jpackage (org.beryx.jlink) 一、如何解决打包问题 java 14以后,有了jpackage工具,能够…

【Axure高保真原型】中继器表格——移入显示详情卡片

今天和大家分享中继器表格——移入显示详情卡片的原型模板,鼠标移入员工姓名,会显示对应员工的详细卡片,那这个原型是用中继器制作的,所以使用也很方便,在中继器表格里维护对应的信息即可。预览时即可生成交互效果&…

Ansible自动化运维以及模块使用

ansible的作用 远程操作主机功能 自动化运维(playbook剧本基于yaml格式书写) ansible是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起 ansible能够批量配置、部署、管理上千台主机。类似于Xshell的一键输入工具。不需要每次都切换主机…

ITIL® 4 Foundation​,12月23日即将开课~想了解点击查看

ITIL 4 Foundation即将开课~ 想报名的必须提前预约啦 👇👇👇 培训地点: 远程直播:线上平台学习 开课时间: 周末班:12月23日、24日; 什么是ITIL? 信息技术基础架构…

【史上最易懂】变分推断:从【求分布】的推断问题,变成【缩小距离】的优化问题,用简单的分布 q 去近似复杂的分布 p

变分推断:从求分布的推断问题,变成缩小距离的优化问题 频率学派与贝叶斯学派变分推断完整推导 频率学派与贝叶斯学派 学过概率论,应该了解过,概率分为 2 个学派: 频率学派:数据是客观的(看到啥…

【ArcGIS微课1000例】0081:ArcGIS指北针乱码解决方案

问题描述: ArcGIS软件在作图模式下插入指北针,出现指北针乱码,如下图所示: 问题解决 下载并安装字体(配套实验数据包0081.rar中获取)即可解决该问题。 正常的指北针选择器: 专栏介绍&#xff…

专攻代码型闪存芯片赛道,芯天下授权世强硬创代理全线产品

近年来受下游应用需求增长的驱动,代码型闪存芯片市场空间持续扩张,在后疫情之下NOR Flash及SLC NAND Flash市场规模整体仍保持逐步增长的趋势。 为了迎合市场需求,世强先进(深圳)科技股份有限公司(下称“世…

青少年CTF-qsnctf-Web-PingMe02

题目环境: 题目难度:★ 题目描述:诶?又是一道Ping题目诶! 给了一个ip参数 传参: ?ip1.1.1.1 有回显结果 使用英文分号";"进行连接后续命令 列出此路径下的目录和文件 ?ip1.1.1.1;ls 列出根目录…