【SpringBoot整合系列】SpringBoot3.x整合Swagger
创始人
2024-12-01 18:04:28
0

目录

  • 产生背景
  • 官方解释:
  • 作用
  • SpringBoot3整合Swagger注意事项
  • swagger3 常用注解
  • SpringBoot3.x整合Swagger
    • 1.创建工程(jdk:17,boot:3.2.4)
    • 2.引入pom依赖
    • 3.application.yml添加配置
    • 4.添加swagger3.0配置
    • 5.控制器层(Controller)
    • 6.模型层(Model)
    • 7.启动并测试
      • 【Get请求接口】/swagger/student接口详情
      • Model详情
      • 【POST请求接口】/swagger/student

产生背景

  • 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了前后端分离的形态,而且前 端技术和后端技术在各自的道路上越走越远。前端和后端的唯一联系,变成了 API 接口,所以 API 文档 变成了前后端开发人员联系的纽带,变得越来越重要。

  • 那么问题来了,随着代码的不断更新,开发人员在开发新的接口或者更新旧的接口后,由于开发任务的 繁重,往往文档很难持续跟着更新,Swagger 就是用来解决该问题的一款重要的工具,对使用接口的人 来说,开发人员不需要给他们提供文档,只要告诉他们一个 Swagger 地址,即可展示在线的 API 接口 文档,除此之外,调用接口的人员还可以在线测试接口数据,同样地,开发人员在开发接口时,同样也 可以利用 Swagger 在线接口文档测试接口数据,这给开发人员提供了便利。

官方解释:

Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。Swagger是⼀个⽤于⽣成服务器接⼝的规范性⽂档、并且能够对接⼝进⾏测试的⼯具。

简单来说:Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务。

作用

  • 接口的文档在线自动生成
  • 功能测试

SpringBoot3整合Swagger注意事项

SpringBoot3+jdk17的情况下,swagger的V2和V3都是不行的。这里使用spring官方出品的springdoc-openapi。在使用springdoc-openapi的时候也有很多坑,首先springdoc-openapi的v1.x.x版本也是不行的,springdoc-openapi的版本必须是v2.x.x以上。

swagger3 常用注解

注解SpringBoot3 版本替换旧注解 SpringBoot2 版本描述
@Tag@Api用于标注一个Controller(Class)。在默认情况下,Swagger-Core只会扫描解析具有@Api注解的类,而会自动忽略其他类别资源(JAX-RS endpoints,Servlets等等)的注解。
@Operation@ApiOperation用于对一个操作或HTTP方法进行描述。具有相同路径的不同操作会被归组为同一个操作对象。不同的HTTP请求方法及路径组合构成一个唯一操作。
@Parameter@ApiParam@Parameter作用于请求方法上,定义api参数的注解。
@Parameters、@Parameter@ApiImplicitParams、@ApiImplicitParam都可以定义参数
(1)@Parameters:用在请求的方法上,包含一组参数说明
(2)@Parameter:对单个参数的说明
io.swagger.v3.oas.annotations新包中的@ApiResponses、@ApiResponse旧包io.swagger.annotations中的@ApiResponses、@ApiResponse进行方法返回对象的说明。
@Schema@ApiModel、@ApiModelProperty@Schema用于描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景)。

SpringBoot3.x整合Swagger

1.创建工程(jdk:17,boot:3.2.4)

项目结构:
在这里插入图片描述

2.引入pom依赖

                             org.springdoc             springdoc-openapi-starter-webmvc-ui             2.2.0           			               org.springframework.boot             spring-boot-starter-web                                org.projectlombok             lombok             true                               org.springframework.boot             spring-boot-starter-test             test          

3.application.yml添加配置

spring:   mvc:     pathmatch:       matching-strategy: ant_path_matcher 

4.添加swagger3.0配置

package com.example.config;  import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  /**  * @author: Susheng  * @datetime: 2024/3/26  * @desc:  */ @Configuration public class OpenAPIConfig {     @Bean     public OpenAPI openAPI() {         return new OpenAPI()                 .info(new Info()                         .title("接口文档标题")                         .description("SpringBoot3 集成 Swagger3接口文档")                         .version("v1"))                 .externalDocs(new ExternalDocumentation()                         .description("项目API文档")                         .url("/"));     } } 

5.控制器层(Controller)

package com.example.controller;  import com.example.model.SwaggerApiModel; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.*; /**  * @author: zjl  * @datetime: 2024/3/26  * @desc:  */ @Tag(name = "控制器:测试Swagger3", description = "描述:测试Swagger3") @RestController public class SwaggerController {      @Operation(summary = "测试Swagger3注解方法Get")     @Parameters({@Parameter(name = "id",description = "编码"),             @Parameter(name = "headerValue",description = "header传送内容")})     @ApiResponses({             @ApiResponse(responseCode = "200", description = "请求成功"),             @ApiResponse(responseCode = "400", description = "请求参数没填好"),             @ApiResponse(responseCode = "401", description = "没有权限"),             @ApiResponse(responseCode = "403", description = "禁止访问"),             @ApiResponse(responseCode = "404", description = "请求路径没有或页面跳转路径不对")     })     @GetMapping(value = "/swagger/student")     public Object getStudent(@RequestParam @Parameter(example = "2")  String id,                              @RequestHeader @Parameter(example = "2") String headerValue){         return id;     }      @Operation(summary = "测试Swagger3注解方法Post")     @ApiResponses({             @ApiResponse(responseCode = "200", description = "请求成功"),             @ApiResponse(responseCode = "400", description = "请求参数没填好"),             @ApiResponse(responseCode = "401", description = "没有权限"),             @ApiResponse(responseCode = "403", description = "禁止访问"),             @ApiResponse(responseCode = "404", description = "请求路径没有或页面跳转路径不对")     })     @PostMapping(value = "/swagger/student", produces = "application/json")     public SwaggerApiModel updateStudent(@RequestBody SwaggerApiModel model){         return model;     }       /**      * swagger 不暴漏该 api,通过@Hidden隐藏      * 但是仍然可以访问      * @return      */     @Hidden     @GetMapping(value = "/swagger/hiddenApi")     public String hiddenApi(){         return "hiddenApi";     }      /**      * swagger 暴漏该 api,没有配置@Hidden会展示      * @return      */     @GetMapping(value = "/swagger/noHiddenApi")     public String noHiddenApi(){         return "noHiddenApi";     } } 

6.模型层(Model)

package com.example.model;  import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data;  import java.io.Serializable;  /**  * @author: zjl  * @datetime: 2024/3/26  * @desc:  */ @Data @Schema(description= "学生信息") public class SwaggerApiModel implements Serializable {      @Schema(description = "主键ID", required = true, example = "1")     private Long id;      @Schema(description = "手机号", required = true)     private String phonenum;      @Schema(description = "密码", required = true)     private String password;      @Schema(description = "年龄", required = true)     private Integer age;  } 

7.启动并测试

启动服务后,首先通过浏览器打开链接http://localhost:9090/swagger-ui/index.html
在这里插入图片描述

【Get请求接口】/swagger/student接口详情

  • 入参
    在这里插入图片描述

  • 响应模板在这里插入图片描述

  • 接口测试
    在这里插入图片描述

  • 接口测试结果
    在这里插入图片描述

Model详情

在这里插入图片描述

【POST请求接口】/swagger/student

在这里插入图片描述在这里插入图片描述

相关内容

热门资讯

一分钟开挂!传送屋有没有挂,约... 一分钟开挂!传送屋有没有挂,约局吧辅助器下载,详细教程-2026最新版本1.约局吧辅助器下载 ai辅...
第六分钟了解!微信小程序微乐房... 第六分钟了解!微信小程序微乐房间怎么开挂(辅助挂)切实是真的挂,安装教程(了解有挂)-哔哩哔哩1、微...
7分钟插件!随意玩h5透视辅助... 7分钟插件!随意玩h5透视辅助,决战卡五星辅助,真是有挂(有挂教程)-哔哩哔哩一、随意玩h5透视辅助...
透视挂透视!竞技联盟破解版最新... 透视挂透视!竞技联盟破解版最新版,pokemomo辅助软件,指引教程(有挂教学)-哔哩哔哩1、起透看...
第8分钟开挂!yy比鸡辅助真的... 第8分钟开挂!yy比鸡辅助真的假的,牛总管辅助免费版,辅助教程-2026最新版本1、打开软件启动之后...
第九分钟详情!情怀游戏字牌辅助... 第九分钟详情!情怀游戏字牌辅助(辅助挂)原来有挂,解密教程(有挂猫腻)-哔哩哔哩1、金币登录送、破产...
第八分钟插件!新众乐辅助,情怀... 第八分钟插件!新众乐辅助,情怀娱乐辅助器,一直是有挂(新版有挂)-哔哩哔哩1、金币登录送、破产送、升...
透视神器!wepoker辅助透... 透视神器!wepoker辅助透视,hhpoker底牌透视脚本,模块教程(有挂分享)-哔哩哔哩1、hh...
第4分钟开挂!微信江苏小程序游... 第4分钟开挂!微信江苏小程序游戏破解器下载,科乐填大坑技巧,详细教程-2026最新版本亲,关键说明,...
第3分钟解密!衢州都莱辅助器开... 第3分钟解密!衢州都莱辅助器开挂(辅助挂)好像真的是有挂,力荐教程(有挂秘笈)-哔哩哔哩1、衢州都莱...