【实战场景】SpringBoot整合Swagger快速实现

news2024/9/25 15:23:07

【实战场景】SpringBoot整合Swagger快速实现

  • 开篇词:
  • 干货篇:
      • 一. Swagger简介
      • 二. SpringBoot整合Swagger3环境搭建
            • 1. 引入maven依赖
            • 2. YML配置
            • 3. Swagger配置类
            • 4. Swagger分组配置
      • 三. Swagger 常用注解配置
            • 1. @Api
            • 2. @ApiOperation
            • 3. @ApiParam
            • 4. @ApiModel 和 @ApiModelProperty
            • 5. @ApiResponses 和 @ApiResponse
            • 6. @ApiImplicitParams与@ApiImplicitParam 参数描述
      • 四. Swagger 接口文档导出/更改UI
      • 五. Swagger 整合常见问题
            • 1. 版本兼容性问题
            • 2. 配置错误
            • 3. 注解使用不当
            • 4. 访问Swagger UI时出现错误
            • 5. Swagger文档不更新
  • 总结
  • 我是杰叔叔,一名沪漂的码农,下期再会!

开篇词:

最近新启用了一个微服务需要接入swagger,下面就一起探讨下接入过程吧

干货篇:

一. Swagger简介

  • 开源工具集: Swagger是一个包含多种工具和库的开源项目,用于支持RESTful API的设计、开发、文档化和测试。
  • 标准化: Swagger通过Swagger Specification(现为OpenAPI Specification)定义了一套标准化的API描述格式,使得API的文档和描述具有一致性和可重用性。
  • 多版本: 在SpringBoot中,Spring 基于Swagger 的标准/规范,开发了一套适用于Spring生态的接口工具框架 Springfox-swagger ,Swagger发展到今天,已经有2.x和3.x两种主流的大版本,同样Springfox-swagger也有两种相应的版本,两种版本略有不同,我们这里主要讲Swagger3的整合与使用。

二. SpringBoot整合Swagger3环境搭建

1. 引入maven依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
2. YML配置

spring boot 2.6.x或更高版本集成Swagger时,直接运行会出现异常信息报错(空指针),主要原因是:Spring Boot 2.6及 更高版本使用的默认路径匹配规则是PathPatternMatcher,而Springfox使用的路径匹配是基于AntPathMatcher的。

所以这里需要更改一下SpringBoot配置。

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
3. Swagger配置类

配置类中各部分配置的含义都已经通过注释说明

@Configuration //声明配置类
@EnableOpenApi //开启swagger支持
public class SwaggerConfig {
 
    /**
     * Docket类是Swagger的配置类,要自定义修改Swagger的默认配置信息,我们需要覆盖该对象
     * @return
     */
    @Bean
    public Docket docket(){
                //1.以OAS_30标准构建Docket配置类
        return new Docket(DocumentationType.OAS_30)
                //2.配置Swagger接口文档基本信息apiInfo
                .apiInfo(apiInfo())
                //3.select方法开启配置扫描接口的Builder
                .select()
                //4.指定要扫描/维护接口文档的包(否则就全部扫描)
                .apis(RequestHandlerSelectors.basePackage("com.example.bootswagger.controller"))
                //5.路径过滤:该Docket-UI展示时,只展示指定路径下的接口文档(any表示都展示)
                .paths(PathSelectors.any())
                .build();
    }
 
    /**
     * 配置 Swagger 接口文档的基本信息
     * @return
     */
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                //1.接口文档标题
                .title("SpringBoot整合Swagger")
                //2.接口文档描述内容
                .description("这里是SpringBoot整合Swagger的详细信息......,包括...")
                //3.项目文档迭代版本
                .version("9.0")
                //4.主要联系人信息(姓名name,个人主页url,邮箱email)
                .contact(new Contact("阿安","www.baidu.com","1436218372@qq.com"))
                //5.相关许可证信息
                .license("The CSDN License")
                //6.相关许可证链接
                .licenseUrl("www.baidu.com")
                //7.返回构建的ApiInfo对象
                .build();
    }
}
    配置完成后启动SpringBoot项目,访问 http://localhost:8080/swagger-ui/index.html 或 http://localhost:8080/swagger-ui/ 即可看到生成的接口文档。
4. Swagger分组配置
    在Swagger实现中,一个Docket配置类对应一组文档配置,既然要进行分组,那么分几组我们就要分别配置几个相应的Docket对象,然后通过groupName()方法配置分组信息(名称)。
@Configuration //声明配置类
@EnableOpenApi //开启swagger支持
public class SwaggerConfig {
 
    /**
     * 配置分组文档 docketA :该部分文档由王五负责,主要涉及UserController相应接口的开发,对应url为 /user/**
     * @return
     */
    @Bean
    public Docket docketA(){
                //1.以OAS_30文档标准构建Docket配置类
        return new Docket(DocumentationType.OAS_30)
                //2.配置Swagger接口文档基本信息apiInfoA
                .apiInfo(apiInfoA())
                //3.配置文档分组-名称
                .groupName("docketA")
                //4.select方法开启配置扫描接口的Builder
                .select()
                //5.指定要扫描/维护接口文档的包:bootswagger.controller
                .apis(RequestHandlerSelectors.basePackage("com.example.bootswagger.controller"))
                //6.指定路径过滤规则:docketA只展示 /user/** 路径下的接口描述(配合包扫描)
                .paths(PathSelectors.ant("/user/**"))
                .build();
    }
 
    /**
     * 配置分组文档 docketB :该部分文档由李四负责,主要涉及AdminController相应接口的开发,对应url为 /admin/**
     * @return
     */
    @Bean
    public Docket docketB(){
        //1.以OAS_30文档标准构建Docket配置类
        return new Docket(DocumentationType.OAS_30)
                //2.配置Swagger接口文档基本信息apiInfoB
                .apiInfo(apiInfoB())
                //3.配置文档分组-名称
                .groupName("docketB")
                //4.select方法开启配置扫描接口的Builder
                .select()
                //5.指定要扫描/维护接口文档的包:bootswagger.controller
                .apis(RequestHandlerSelectors.basePackage("com.example.bootswagger.controller"))
                //6.指定路径过滤规则:docketA只展示 /user/** 路径下的接口描述(配合包扫描)
                .paths(PathSelectors.ant("/admin/**"))
                .build();
    }
 
    /**
     * 配置 文档A 的基本信息
     * @return
     */
    private ApiInfo apiInfoA(){
        return new ApiInfoBuilder()
                //1.接口文档标题
                .title("文档A:SpringBoot整合Swagger")
                //2.接口文档描述内容
                .description("这里是SpringBoot整合Swagger的详细信息......,包括...")
                //3.项目文档迭代版本
                .version("9.0")
                //4.主要联系人信息(姓名name,个人主页url,邮箱email)
                .contact(new Contact("王五","www.baidu.com","1436218372@qq.com"))
                //7.返回构建的ApiInfo对象
                .build();
    }
 
    /**
     * 配置 文档B 的基本信息
     * @return
     */
    private ApiInfo apiInfoB(){
        return new ApiInfoBuilder()
                //1.接口文档标题
                .title("文档B:SpringBoot整合Swagger")
                //2.接口文档描述内容
                .description("这里是SpringBoot整合Swagger的详细信息......,包括...")
                //3.项目文档迭代版本
                .version("2.0")
                //4.主要联系人信息(姓名name,个人主页url,邮箱email)
                .contact(new Contact("李四","www.baidu.com","1436218372@qq.com"))
                //7.返回构建的ApiInfo对象
                .build();
    }
}

三. Swagger 常用注解配置

Swagger(或现在更常用的OpenAPI规范)提供了许多注解,用于在Java代码中以声明性方式定义API的元数据。这些注解被Swagger库(如Springfox用于Swagger 2.x或SpringDoc用于OpenAPI 3.x)扫描和处理,以生成API文档。以下是一些常用的Swagger注解及其配置示例:

1. @Api

在Swagger 2.x中,@Api注解用于标记一个类作为Swagger文档中的一个资源(通常是一个RESTful Controller)。在OpenAPI 3.x中,这个注解的使用已经较少,因为SpringDoc等库提供了自动扫描Controller的机制。
Swagger 2.x 示例:

import io.swagger.annotations.Api;  
import io.swagger.annotations.ApiOperation;  
  
@Api(value = "用户接口", tags = {"用户管理"})  
@RestController  
@RequestMapping("/users")  
public class UserController {  
    // ...  
}
2. @ApiOperation

@ApiOperation注解用于描述一个具体的方法操作。你可以用它来指定方法的简短描述、HTTP方法、是否产生响应等。
示例:

import io.swagger.annotations.ApiOperation;  
  
@ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户详细信息", httpMethod = "GET")  
@GetMapping("/{id}")  
public ResponseEntity<User> getUserById(@PathVariable Long id) {  
    // ...  
}
3. @ApiParam

@ApiParam注解用于描述方法的参数。它提供了参数的名称、是否必需、数据类型以及描述等信息。
示例:

import io.swagger.annotations.ApiParam;  
  
@GetMapping("/search")  
public ResponseEntity<List<User>> searchUsers(  
    @ApiParam(value = "搜索关键字", required = true) @RequestParam String keyword) {  
    // ...  
}
4. @ApiModel 和 @ApiModelProperty

@ApiModel用于描述一个返回的对象(或请求的参数对象)。@ApiModelProperty则用于描述对象中的一个属性。
示例:

import io.swagger.annotations.ApiModel;  
import io.swagger.annotations.ApiModelProperty;  
  
@ApiModel(description = "用户信息")  
public class User {  
  
    @ApiModelProperty(value = "用户ID", example = "12345")  
    private Long id;  
  
    @ApiModelProperty(value = "用户名", required = true)  
    private String username;  
  
    // getters and setters  
}
5. @ApiResponses 和 @ApiResponse

@ApiResponses用于列出一个方法可能返回的所有响应。@ApiResponse则用于描述其中的一个响应,包括HTTP状态码、描述以及可能返回的对象。
示例:

import io.swagger.annotations.ApiResponses;  
import io.swagger.annotations.ApiResponse;  
  
@ApiResponses(value = {  
    @ApiResponse(code = 200, message = "请求成功", response = User.class),  
    @ApiResponse(code = 404, message = "未找到资源")  
})  
@GetMapping("/{id}")  
public ResponseEntity<User> getUserById(@PathVariable Long id) {  
    // ...  
}
6. @ApiImplicitParams与@ApiImplicitParam 参数描述
@ApiImplicitParams(list=[ ]):该注解作用在接口方法上,是ApiImplicitParam的列表
@ApiImplicitParam(name="参数名称",value = "参数说明",defaultValue = "参数默认值",dataType = "数据类型"):该注解作用于ApiImplicitParams列表内,用于对方法上的参数进行描述说明。
@RestController
@RequestMapping("/user")
@Api(tags = "用户请求处理Controller")
public class UserController {
 
   @ApiOperation(value = "用户登陆方法",notes = "<span style='color:red;'>描述:</span>&nbsp;用来执行用户登录方法的接口",response = ResultVo.class)
    @RequestMapping(value = "/login",method = RequestMethod.GET)
    @ApiImplicitParams({
            @ApiImplicitParam(name="username",value = "用户名",defaultValue = "admin",dataType = "String"),
            @ApiImplicitParam(name="userInfo",value = "用户信息",defaultValue = "nothing",dataType = "String")
    })
    public ResultVo loginUser(String userName,String userInfo){
        System.out.println(userName);
        System.out.println(userInfo);
        ResultVo resultVo = new ResultVo();
        resultVo.setCode(1);
        resultVo.setMessage("Login SUCCESS");
        return resultVo;
    }
 
}

注意:参数使用@RequestBody时,@ApiImplicitParam的type就不要使用body了,二者相互冲突,可以使用 @ApiParam 处理。而且不使用@RequestBody时,@ApiImplicitParam将参数统一附加到地址url;使用@RequestBody后,不再附加。

四. Swagger 接口文档导出/更改UI

Swagger原生官方依赖不提供文档导出功能,只能网页在线查看。所以要实现接口文档导出,我们可以整合第三方Swagger-UI界面提供的文档导出功能(主要)
bootstrap-UI
Layui-UI
mg-UI
knife4j
例如bootstrap-UI,引入依赖

<dependency>
   <groupId>com.github.xiaoymin</groupId>
   <artifactId>swagger-bootstrap-ui</artifactId>
   <version>1.9.6</version>
</dependency>

五. Swagger 整合常见问题

Swagger整合Spring Boot的过程中,开发者可能会遇到一些常见问题。这些问题通常与版本兼容性、配置错误、注解使用不当等方面有关。以下是一些常见的问题及其解决方案:

1. 版本兼容性问题
  • 问题描述:
    在整合Swagger时,由于Spring Boot和Swagger的版本不匹配,可能会出现启动失败、文档无法生成等问题。
  • 解决方案:
    确保使用的Swagger版本与Spring Boot版本兼容。例如,Spring Boot 2.7及以上版本推荐使用Swagger 3.x(通过SpringDoc OpenAPI库实现)而非Swagger 2.x。
    对于Swagger 2.x,建议使用Spring Boot 2.6及以下版本。
    查看Maven官方仓库或相关文档,获取版本兼容性的详细信息。
2. 配置错误
  • 问题描述:
    配置文件中的错误设置(如application.yml或application.properties)可能导致Swagger无法正常工作。
  • 解决方案:
    检查配置文件中的Swagger相关配置是否正确。例如,确保Swagger的扫描包路径、端口号、上下文路径等设置正确。
    对于Spring Boot 2.6及以上版本,如果使用了Swagger 3.x(通过SpringDoc OpenAPI),需要添加相应的配置注解(如@EnableOpenApi)和依赖。
    如果遇到路径匹配问题(如Spring Boot 2.6.X引入的新路径匹配策略导致的与Springfox的不兼容),可以在配置文件中设置spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER。
3. 注解使用不当
  • 问题描述:
    在Controller或Model类中使用Swagger注解时,如果注解使用不当(如位置错误、属性设置错误等),可能会导致生成的API文档不完整或错误。
  • 解决方案:
    确保Swagger注解被正确放置在类、方法或参数上。
    检查注解的属性设置是否正确,如@ApiOperation的summary、description等属性。
    对于复杂的Model类,使用@ApiModel和@ApiModelProperty等注解来详细描述其结构和属性。
4. 访问Swagger UI时出现错误
  • 问题描述:
    在浏览器中输入Swagger UI的访问地址后,可能出现404错误、页面无法加载或显示错误信息等。
  • 解决方案:
    确保Swagger UI的访问地址正确。对于Swagger 2.x,通常是/swagger-ui.html;对于Swagger 3.x(通过SpringDoc OpenAPI),可能是/swagger-ui/index.html。
    检查Spring Boot应用是否已正确启动并正在监听预期的端口。
    检查是否有安全配置(如Spring Security)阻止了对Swagger UI的访问。如果是,请添加相应的权限配置以允许访问。
5. Swagger文档不更新
  • 问题描述:
    在修改Controller或Model类后,生成的Swagger文档没有更新以反映这些更改。
  • 解决方案:
    确保在修改代码后重新编译并重启Spring Boot应用。
    检查是否有缓存机制(如浏览器缓存或服务器缓存)影响了文档的更新。尝试清除缓存后再次访问。
    总结

总结

对于OpenAPI 3.x(通常与SpringDoc一起使用),注解的名称和某些属性可能有所不同,但基本概念是相似的。
某些Swagger 2.x的注解在OpenAPI 3.x中可能没有直接对应的注解,因为OpenAPI 3.x提供了更丰富的功能和更清晰的语义。
在实际项目中,应根据所使用的库(Springfox或SpringDoc)和OpenAPI规范版本(2.x或3.x)来选择合适的注解和配置方式。
其他坑留着大家一起踩完,一起分享吧~~

在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!

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

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

相关文章

工程技术人员职称专业一览表,赶紧收藏!有助评职称、落户

现在很多地区为了引进人才&#xff0c;都会对各类获得中级或高级职称的人才提供一系列优惠政策&#xff0c;比如人才补贴、职称入户等等。 下面小编就来为大家介绍一下中级职称专业一览表&#xff0c;告诉你能以考代评的几个考试&#xff0c;需要评职称、落户的快看过来&#…

C#中Override与New关键字的运用及实例解析

文章目录 override 关键字new 关键字使用场景使用注意事项和最佳实践总结 在C#编程中&#xff0c;override 和 new 关键字用于处理类的继承和方法的重写。理解它们的用法和区别对于编写清晰和高效的面向对象代码至关重要。本文将详细阐述这两个关键字的含义、使用场景&#xff…

5分钟带你走近:LVS负载均衡(lvs知识点+实验配置)

集群和分布式简介 1、系统性能扩展方式 Scale UP&#xff1a;向上扩展,增强 Scale Out&#xff1a;向外扩展,增加设备&#xff0c;调度分配问题&#xff0c;Cluster 2、集群Cluster Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统 Cluster常见…

PDF扫描?用lookscanned就好了【送源码】

日常工作&#xff0c;我们有时会需要把电子文档转换成看起来像是用扫描仪扫描出来的PDF文件&#xff0c;满足某些特定的需求&#xff0c;你懂的~~ 有时候身边没有打印机或者打印纸&#xff0c;或者打印不方便&#xff0c;总不至于每天都背着吧&#xff1f; 今天要跟大家聊聊一…

SX_错误声明定义了两个以上的数据类型BUG解决_14

具体报错&#xff1a; In file included from perfmon_priv.h:32,from perfmond.c:21: perfmon_api.h:7:18: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned char perfmon_api.h:7:27: 错误: 声明指定了两个以上的数据类型7 | #define uint8_t unsigned cha…

《人工智能算力资源池技术规范》团体标准正式发布!

由趋动科技提出、中关村新兴科技服务业产业联盟牵头、联合行业专家单位参与&#xff0c;遵循标准制定流程&#xff0c;经过批准起草小组会议讨论、广泛征求意见、委员会草案投票等流程的《人工智能算力资源池技术规范》团体标准&#xff08;标准编号为T/STSI 43—2023&#xff…

洛谷 P1433 吃奶酪

原题https://www.luogu.com.cn/problem/P1433 Description 房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉&#xff0c;问至少要跑多少距离&#xff1f;老鼠一开始在 (0,0)点处。 Input 第一行有一个整数&#xff0c;表示奶酪的数量 n。 第 2 到第(n1) 行&#xff0c;每行…

短视频SDK,支持Flutter跨平台框架,加速产品上线进程

在数字内容爆炸式增长的今天&#xff0c;短视频已成为连接用户、传递情感、展现创意的重要桥梁。为助力开发者快速融入这股潮流&#xff0c;美摄科技匠心打造了一款专为Flutter框架优化的短视频SDK解决方案&#xff0c;旨在降低技术门槛&#xff0c;加速产品迭代&#xff0c;让…

商标直接注册初审通过提高的注意!

近日下了一批商标注册申请初步审定公告通知书&#xff0c;普推知产商标老杨发现其实许多商标名称申请在前&#xff0c;经过专业检索查重&#xff0c;基本上就知道通过率如何&#xff0c;虽然是一个预判&#xff0c;但是对于有经验的商标代理人员来说&#xff0c;预估七成基本判…

HTML - 简易版打字练习

1. 赛博朋克风格的视觉设计 颜色与渐变&#xff1a;通过linear-gradient设置了背景的颜色渐变&#xff0c;使用高饱和度的霓虹色彩&#xff08;如橙色、绿色和蓝色&#xff09;来营造赛博朋克的视觉效果。这种配色方案是赛博朋克风格的典型元素。 立体感和阴影&#xff1a;使用…

春秋云镜CVE-2023-38836

打开靶场环境 点击发现一个登陆框&#xff0c;弱口令试一下 发现账号密码为admin,password 随便点击点击 Media发现这里可以上传文件上传木马试试 <?php eval($_POST["wjq"]); ?> 发现不能上传php文件 php内容 修改他的格式 抓包绕过一下 302就可以其实已经…

绘制echarts-liquidfill水球图

文章目录 一、效果图二、步骤1.安装插件2.引入2.主要代码2.素材图片 总结 一、效果图 二、步骤 1.安装插件 npm install echarts npm install echarts-liquidfillecharts5的版本与echarts-liquidfill3兼容&#xff0c;echarts4的版本与echarts-liquidfill2兼容,安装的时候需要…

Spring I

1. IoC & DI ⼊⻔ 1.1 Spring 是什么&#xff1f; 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的…

C++中的搜索二叉树模拟实现代码

包含的功能&#xff1a;插入、删除、查找、中序遍历&#xff08;排列大小&#xff09; 代码&#xff1a;

Linux 内核源码分析---proc 文件系统

proc文件系统 进程数据文件系统&#xff08;process data filesystem, procfs&#xff09;装载在 /proc&#xff0c;缩写为 procFS。 proc 文件系统是一种虚拟文件系统&#xff0c;其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统&…

WPF篇(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件&#xff0c;属性以及使用案例&#xff0c;从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮&#xff08;Button&#xff09;、单选(RadioButton)、复选&#xff08;CheckBox&#xff09;、文本框…

【JavaEE初阶】JUC(java.uitl.concurrent)的常见类

&#x1f334;Callable 接口 之前讲到Runnable接口&#xff0c;用于描述一个任务&#xff0c;通过Runnable中的run方法来体现的&#xff0c;但是描述的任务没有返回值&#xff08;run方法是返回void&#xff09;&#xff0c;此处的Callable接口与Runnable接口类似&#xff0c;C…

LLVM理论篇之编译器前端

1、简述 LLVM前端通过对源程序的预处理&#xff0c;构成源程序的字符流扫描与分解&#xff0c;将单词序列提取为各类语法短语&#xff0c;生成抽象语法树&#xff0c;最终转换为中间代码。编译器前端包含的这几个过程如下&#xff1a; &#xff08;1&#xff09;预编译 &…

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件&#xff08;假设都是.jpg格式&#xff09;image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…