springboot 集成 Swagger2(速通)

news2025/1/9 19:01:35

目录

  • 1. 概述
  • 2. 案例 1
  • 3. UI 的简单使用
  • 4. 简单配置 Docket 对象
    • 1. 配置文档的描述信息
    • 2. 定义包扫描规则
  • 5. 指定接口不生成文档
    • 1. 自定义注解
    • 2. 路径匹配
  • 6. 常用注解

1. 概述

简单理解——代写接口文档的框架,可跟随接口修改实时更新。

Open API 格式:REST API 的描述格式,可使用 YAML 或 JSON 格式来编写。Open API 的描述范围:

  • 每个访问地址的类型;
  • 每个操作的参数;
  • 认证方法;
  • 连接信息、声明,使用团队和其他信息。

Swagger :一套围绕 Open API 规范构建的一款 RESTful 接口的文档在线自动生成和功能测试 API。将相关信息通过 YAML/JSON 格式存储在描述文件中,再通过描述文件去更新接口文档。其工具组包:

  • Swagger Editor:基于浏览器编辑器,可以编写 Open API 规范;
  • Swagger UI:将 Open API 规范呈现为交互式 API 文档,即描述文件(常用);
  • Swagger Codegen:将描述文件生成 HTML 和 cwiki 形式的接口文档,可同时生成多种语言的客户端和服务端代码;
  • Swagger Inspector:类似 Swagger UI,但包含更多信息,比如请求的实际参数数据;
  • Swagger Hub:集成上面工具的所有功能,上传描述文件到 Hub ,就可以完成上面工具的所有工作。

Springfox:Swagger 在遇到版本迭代的时候还需要更改描述文件,但 Springfox 则优化了此过程,会根据代码实时生成文档。通过注解的方式将 Swagger 集成在代码中。

2. 案例 1

依赖:

  • web 项目

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
  • springfox 依赖,要一次性导入下面两个,版本要对应

            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2<</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2<</version>
            </dependency>
    

注解:

  • 启动类注解:

    @EnableSwagger2         // 开启 swagger2 相关技术,扫描当前类所在包及其子包中的注解 
    @SpringBootApplication
    
  • 控制类:

    @RestController
    public class SwaggerController {
        @GetMapping("/get")
        public String getStr(String str) {
            return "SELECT " + str;
        }
    
        @PostMapping("/post")
        public String postStr(String str) {
            return "CREATE " + str;
        }
    
        @PutMapping("/put")
        public String putStr(String str) {
            return "UPDATE " + str;
        }
    
        @PatchMapping("/patch")
        public String patchStr(String str) {
            return "UPDATE " + str;
        }
        
        @DeleteMapping("/delete")
        public String deleteStr(String str) {
            return "DELETE " + str;
        }
    }
    
  • 运行代码,访问 http://127.0.0.1:8080/swagger-ui.html,这里可能会遇到以下的报错:

    启动项目遇到报错:java: 警告: 源发行版 17 需要目标发行版 17
    解决方案:https://blog.csdn.net/weixin_44299027/article/details/120848738


    启动项目遇到报错:类文件具有错误的版本 61.0, 应为 52.0
    解决方案:spring6.0 开始 jdk 要求17以上才行,要么升级 JDK,要么降低 spring 版本。
    我选择降低 spring 版本:

    • https://mvnrepository.com/ 查看 spring-boot-starter-parent 的版本号
    • 选择 3 以下的版本号,修改 Maven 依赖 spring-boot-starter-parent


    启动项目遇到报错:Failed to start bean ‘documentationPluginsBootstrapper’;
    解决方案:springboot 升级到 2.6.0之后,swagger版本和springboot出现了不兼容情况,要么降低 springboot 版本,要么配置 spring.mvc.pathmatch.matching-strategy=ant_path_matcher

    • A.降低 springboot 版本不再做赘述(可降低至 2.5 以下就绝对没问题);
    • B.配置1:① 启动类加上注解 @EnableWebMvc;② 配置文件加上 spring.mvc.pathmatch.matching-strategy=ant_path_matcher;
    • C.配置1不生效情况:参考:https://blog.csdn.net/weixin_39792935/article/details/122215625
    • D.当上述三种解决方案都不生效的情况下,我采用的终极解决方案:降低 Springboot 版本(2.5.6),并采用 C 方案的配置,然后访问 http://127.0.0.1:8080/swagger-ui.html

      访问页面为空:

      解决方案:启动类加上注解@EnableOpenApi ,并访问 http://localhost:8080/swagger-ui/index.html
  • 解决无法访问的问题:

    • 修改配置文件 application.properties

      spring.mvc.pathmatch.matching-strategy=ant_path_matcher
      
    • 新增配置类:

      package com.chenjy.swagger.config;
      
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
      
      /**
       * @Desc 解决高版本无法兼容 swagger2 的问题
       *       如此配置之后,就可通过 http://127.0.0.1:8080/doc.html 去访问 swagger-ui.html
       */
      @Configuration
      public class WebMvcConfigurer extends WebMvcConfigurationSupport {
      
          /**
           * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
           */
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
              registry.addResourceHandler("/**").addResourceLocations(
                      "classpath:/static/");
              registry.addResourceHandler("swagger-ui.html", "doc.html").addResourceLocations(
                      "classpath:/META-INF/resources/");
              registry.addResourceHandler("/webjars/**").addResourceLocations(
                      "classpath:/META-INF/resources/webjars/");
              super.addResourceHandlers(registry);
          }
      
      }
      
    • 降低 springboot 版本到 2.5.6

          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.5.6</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
      
  • 访问界面如下图,可以从中看到我们写的接口:

3. UI 的简单使用

扫描项目中(启动类同级目录及其子目录中)的所有控制器(默认是控制器) 中的 @GetMapping/@RequestMapping(method = {RequestMethod.GET}) 系列的注解,然后去解析注解对应的映射地址以及注解约束的请求方式(GET、POST、DELET…,默认为 GET)。点击具体方法可看详细的请求信息:

可点击 Try it out 测试一下:

4. 简单配置 Docket 对象

1. 配置文档的描述信息

package com.chenjy.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfigurer {

    /**
     * @return Docket——Swagger 中的全局配置对象
     */
    @Bean
    public Docket docket() {
        // DocumentationType.SWAGGER_2 告诉 Springfox 当前的 Swagger 版本是 Swagger2
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        // API 帮助文档的描述信息
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("Swagger 文档")// 文档标题
                .description("Swagger :一套围绕 Open API 规范构建的一款 RESTful 接口的文档在线自动生成和功能测试 API。")// 描述信息
                .version("1.0.1")// 版本号
                .contact(
                        // name url email
                        new Contact("364.99°的文档", // 文档发布者名称
                                "https://blog.csdn.net/m0_54355172", // 文档发布者的网站地址
                                "2190826197@qq.com" // 文档发布者的邮箱
                        )
                )
                // 构建器模式
                .build();
        // 给 docket 上下文配置 API 描述信息
        docket.apiInfo(apiInfo);
        return docket;
    }
}

2. 定义包扫描规则

在 docket 方法中添加以下配置:

        docket
                .select() // 获取 docket 中的选择器,如:扫描哪个包的注解
                .apis(RequestHandlerSelectors.basePackage("com.chenjy.swagger.controller")); // 定义规则——包扫描规则

5. 指定接口不生成文档

1. 自定义注解

如何自定义一个注解

定义一个注解,标注当前接口不需要生成 Swagger 文档:

package com.chenjy.swagger.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE}) // 此注解用于描述 方法、类
@Retention(RetentionPolicy.RUNTIME)// 注释信息会在运行时被有效
public @interface NoSwagger {
    // 自定义注解属性 @NoSwagger(value="")
    String value() default "";
}

配置类使注解规则生效:

package com.chenjy.swagger.config;

import com.chenjy.swagger.annotation.NoSwagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import static com.google.common.base.Predicates.not;
import static springfox.documentation.builders.RequestHandlerSelectors.withMethodAnnotation;

@Configuration
public class SwaggerConfigurer {

    /**
     * @return Docket——Swagger 中的全局配置对象
     */
    @Bean
    public Docket docket() {
        // DocumentationType.SWAGGER_2 告诉 Springfox 当前的 Swagger 版本是 Swagger2
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        // API 帮助文档的描述信息
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("Swagger 文档")// 文档标题
                .description("Swagger :一套围绕 Open API 规范构建的一款 RESTful 接口的文档在线自动生成和功能测试 API。")// 描述信息
                .version("1.0.1")// 版本号
                .contact(
                        // name url email
                        new Contact("364.99°的文档", // 文档发布者名称
                                "https://blog.csdn.net/m0_54355172", // 文档发布者的网站地址
                                "2190826197@qq.com" // 文档发布者的邮箱
                        )
                )
                // 构建器模式
                .build();
        // 给 docket 上下文配置 API 描述信息
        docket.apiInfo(apiInfo);
        Docket build = docket
                .select() // 获取 docket 中的选择器,如:扫描哪个包的注解
                .apis(
                        not( // 取反
                                withMethodAnnotation(NoSwagger.class) // 当方法上有注解的时候返回 true
                        )
                )
                .apis(RequestHandlerSelectors.basePackage("com.chenjy.swagger.controller")) // 定义规则——包扫描规则
                .build();
        return build;
    }
}

注意: 这里需要重新 build 一次 Docket ,然后返回重新 build 之后的 docket,否则不会生效。

标注在接口方法上:

    @NoSwagger
    @PatchMapping("/patch")
    public String patchStr(String str) {
        return "UPDATE " + str;
    }

重启项目,访问:

优化写法:

        Docket build = docket
                .select() // 获取 docket 中的选择器,如:扫描哪个包的注解
                .apis(
                        and(
                                not( // 取反
                                        withMethodAnnotation(NoSwagger.class) // 当方法上有注解的时候返回 true
                                ),
                                RequestHandlerSelectors.basePackage("com.chenjy.swagger.controller")
                        )
                )
                .build();
        return build;

注意:

  • andnot 都是 com.google.common.base.Predicates 中的静态方法;
  • withMethodAnnotationspringfox.documentation.builders.RequestHandlerSelectors 中的静态方法。

2. 路径匹配

springfox.documentation.builders.PathSelectors

只有路径前缀为 /test 的接口方法才会生成文档。

        Docket build = docket
                .select() // 获取 docket 中的选择器,如:扫描哪个包的注解
                .paths(
                        PathSelectors.regex("/test/.*") // 使用正则表达式  . 任意字符   * 0个或多个
                )
                .build();
        return build;

同时多种路径匹配规则: Predicates.or

                .paths(
                        Predicates.or(
                                PathSelectors.regex("/test/.*"),
                                PathSelectors.regex("/.*")
                        )
                )

→ 正则表达式语法 ←

6. 常用注解

@Api(tags = {"test 接口 API"})

  • 类注解,描述当前类型生成帮助文档的信息;
  • tags 定义控制器别名,可以有多个值,有几个别名,文档中就有几个控制器目录。

@ApiOperation(value = "get 方法,执行查询操作", notes = "一个小 demo")

  • 类、方法注解,常用来描述方法。

@ApiParam()

  • 参数、方法、属性注解,常用来描述参数;

    @PostMapping("/post")
    public String postStr(
            @ApiParam(name = "字符串", value = "用来输出的字符串", required = true) String str,
            @ApiParam(name = "序列号", required = false) @RequestParam(defaultValue = "001", required = false)String num
    ) {
        return "CREATE " + str + num;
    }
    

@ApiIgnore

  • 方法、属性注解,让此注解描述的方法或类型不生成 API 文档。

        @ApiIgnore
        @PutMapping("/put")
        public String putStr(String str) {
            return "UPDATE " + str;
        }
    

@ApiImplicitParam

  • 在方法上描述方法参数,只能描述一个参数。

        @ApiImplicitParam(
                name = "str", value = "一个字符串", required = true, paramType = "java.lang.String", dataType = "任意字符串"
        )
        @DeleteMapping("/delete")
        public String deleteStr(String str, Integer num) {
            return "DELETE " + str;
        }
    

ApiImplicitParams

  • 在方法上描述参数,可以描述多个参数。
        @ApiImplicitParams(value = {
               @ApiImplicitParam( name = "str", value = "一个字符串", required = true, paramType = "java.lang.String", dataType = "任意字符串" ),
               @ApiImplicitParam( name = "num", value = "一个整数") 
        })
        @DeleteMapping("/delete")
        public String deleteStr(String str, Integer num) {
            return "DELETE " + str;
        }
    

@ApiModel

  • 描述实体类,当此实体类被作为返回类型用于 API 帮助文档中的接口方法中,此注解被解析。

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ApiModel( value = "一个实体类", description = "存储数据并返回")
    public class TestDto {
        private String name;
        private Integer num;
    }
    
        @PatchMapping("/patch")
        public TestDto patchStr(String str, Integer num) {
            return new TestDto(str, num);
        }
    

@ApiModelProperty

  • 描述实体类的属性,要搭配 @ApiModel 使用。

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ApiModel( value = "一个实体类", description = "存储数据并返回")
    public class TestDto {
        @ApiModelProperty( value = "姓名", example = "张三", hidden = false)
        private String name;
        @ApiModelProperty( value = "序列号")
        private Integer num;
    }
    


注意:

  • GET:不能使用 @requestBody
  • POST:可以使用 @requestBody (对于参数转化的配置必须统一)和 @requestParam

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

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

相关文章

【服务器】安卓手机使用Termux搭建web服务

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 概述 1.搭建apache 2.安装cpolar内网穿透 3.公网访问配置 4.固定公网地址 5.添加站点 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个…

从C语言到C++_12(string相关OJ题)(leetcode力扣)

上一篇已经讲了string类的接口函数&#xff0c;然后根据查文档刷了牛客和力扣58最后一个单词的长度&#xff0c; 还有力扣415字符串相加&#xff0c;这篇继续跟着查文档来刷力扣题&#xff0c;体会C刷题的方便。 目录 917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xf…

ESP32 智能手表软件设计,具有多个表盘、心率传感器、指南针和游戏

ESP32 智能手表 GUI 导航 整个 GUI 的设计方式使我们可以使用单个按钮浏览每个选项。我们可以使用短按和长按来浏览它们。您可以在下图中找到整个 GUI 流程。蓝线表示单击/短按,而绿线表示长按。在时间设置和设置菜单中,您可以浏览每个选项或使用短时钟归档。选择该选项并使用…

搭建简单的HTTP服务器(Nodejs) - 内网穿透公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自cpolar内网穿透的文章&#xff1a;使用Nodejs搭建HTTP服务&#xff0c;并实现公网远程访问「内网穿透」 前言 Node.…

【工业控制系统】工业控制系统安全简介第 2 部分

介绍 Purdue Enterprise Reference Architecture (PERA)、其他参考模型和安全 ICS 架构的最佳实践。 安全 ICS 架构的 Purdue 模型和最佳实践 在本系列的第一部分中&#xff0c;我们回顾了工业控制系统 (ICS) 的独特沿袭&#xff0c;并介绍了保护 ICS 的一些挑战。在第二部分中…

初识滴滴交易策略之二:司乘匹配

‍ 前文&#xff08;初识滴滴交易策略之一&#xff1a;交易市场)整体介绍了交易市场的定义、特点、技术特点和技术领域。在交易市场中&#xff0c;市场交易撮合——通常称之为“派单”——无疑是最重要的环节&#xff0c;以下将介绍滴滴交易市场中的司乘匹配技术。 对滴滴来说&…

全球523所高校,10425人共同学习,这所高校排第一!

Datawhale学习 总结&#xff1a;四月AIGC组队学习 在公众号回复“五月”可以提前进大模型应用交流群了&#xff0c;探索大模型的产品应用。回复“AIGC”&#xff0c;可以进AIGC交流群&#xff0c;用AIGC工具为自己打工。五月组队学习这周会在群内分享。 五月组队学习预告 全球…

2023年国内CDGA/CDGP数据治理认证考试报名入口

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

DNDC模型三:气象数据、土地数据、土壤数据、区域数据制备

查看原文>>>最新DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术应用 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&a…

Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

第14章:触发器概述

一、触发器概述 1.开发场景 有2个相互关联的表&#xff0c;商品信息和库存信息表。在添加一条新商品记录时&#xff0c;为了保证数据完整性&#xff0c;在库存表添加一条库存记录。 把两个关联操作步骤写到程序里面&#xff0c;用事务包裹起来&#xff0c;确保两个操作成为一…

Qt6之默认取消MySQL支持?

说明&#xff1a;本篇不是讨论qt怎么使用MySQL&#xff0c;这类的文章一搜一大堆。 一、结论 Qt6开始确实默认取消了对MySQL的支持&#xff0c;用户需自行编译生成MySQL的驱动DLL库。 首先不是qt增加使用门槛是风向变了&#xff0c;而是自从Oracle 收购MySQL后对其进行了商业化…

LC-1377. T 秒后青蛙的位置(DFS、BFS)

1377. T 秒后青蛙的位置 难度困难57 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点&#xff08;如果它们直接相连&#xff09;。青…

一键呼叫可视对讲用于路灯杆

城市建设进入新时代&#xff0c;各种智慧化设施应运而生。路灯杆一键呼叫可视对讲系统可以实现智能安防、信息传递等多种功能&#xff0c;成为城市智慧化的重要组成部分。 1. 系统介绍 路灯杆一键呼叫可视对讲系统由路灯杆、摄像头、语音呼叫器等组成。当市民需要求助或报警时…

大数据开发之Hive案例篇5- count(distinct) 优化一例

文章目录 一. 问题描述二. 解决方案2.1 调整reduce个数2.2 SQL改写 一. 问题描述 需求: 卡在了reduce&#xff0c;只有一个reduce MR job卡在了最后一个reduce&#xff0c;任务迟迟未运行成功 二. 解决方案 2.1 调整reduce个数 一般一个reduce处理的数据是1G&#xff0c…

【Dubbo核心 详解四】Dubbo服务提供者的详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Dubbo核心详解(附代码示例) 文章目录 引言一、服务提供者1.1 服务提供者介绍Dubbo 服务提供者启…

NPDP|产品经理的硬实力体现在哪里?

在企业里&#xff0c;产品经理是一个具有综合职能的职位&#xff0c;其工作的范围可以说已经遍及到了公司的每个角落其接触的人员也涉及公司几乎所有的部门。 产品经理是产品品牌塑造者、更是营销骨干&#xff0c;是一套完善的营销运作制度&#xff0c;更是博大精深的营销操作…

git clone 报错10054,解决方法

使用git clone下载工程时&#xff0c;报错提示如下&#xff1a; fatal: unable to access https://github.com/deozhang/GaoZhongShuXue.git/: OpenSSL SSL_read: Connection was reset, errno 10054 报错提示的代码是10054&#xff0c;根据提示和网上搜索结果&#xff0c;可以…

Ae:跟踪运动

使用跟踪器 Tracker面板的跟踪运动 Track Motion功能&#xff0c;可通过手动添加和设置跟踪点来跟踪对象的运动&#xff0c;并能将获得的跟踪数据应用于其它对象。 Ae菜单&#xff1a;窗口/跟踪器 Tracker 点击跟踪器面板上的“跟踪运动”按钮&#xff0c;会为图层添加“动态跟…

Charles使用教程【简易版】

Charles抓包教程 1、电脑安装charles 2、电脑打开charles后安装root证书 3、电脑信任证书 4、手机连接与电脑同一wifi 5、设置手机代理 wlan设置中将当前 wifi 的代理改成手动&#xff0c;主机名填电脑 ip&#xff0c;端口填8888 此时如果当前手机是第一次被你的电脑设备代理或…