Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3

這篇文章資料來自于網絡,對部分知識整理,這里只是記錄一下,僅供參考

為什么要用 Swagger

????????Swagger 的核心思想是通過定義和描述 API 的規范、結構和交互方式,以提高 API 的可讀性、可靠性和易用性,同時降低 API 開發的難度和開發者之間的溝通成本。

????????這里我采用了 Swagger3.0(Open API 3.0)的方式集成到 SpringBoot。springfox-boot-start 和 springfox-swagger2 都是基于 Swagger2.x 的。

????????這里將介紹 springdoc-openapi-ui,它是 SpringBoot 基于 Open API 3.0(Swagger3.0)

SpringFox 與 Swagger 的關系

????????Springfox 是一套可以幫助 Java 開發者自動生成 API 文檔的工具,它是基于 Swagger 2.x 基礎上開發的。

????????除了集成 Swagger 2.x,Springfox 還提供了一些額外功能,例如自定義 Swagger 文檔、API 版本控制、請求驗證等等。

但是隨著時間的推移,Swagger2.x 終究成為歷史,所以我們可以看出 springfox-boot-starter 的坐標從 3.0.0 版本(2020 年 7 月 14 日)開始就一直沒有更新; 也得注意的是 springfox-swagger2 坐標和 springfox-boot-start 是一樣的,但 springfox-boot-start 只有 3.0.0 版本。這里我就不在使用 Swagger2.x 版本

添加依賴

由于篇幅原因,其他web項目相關依賴這里就不一一貼出來了。

第一個依賴是必須的,而且版本必須大于2.0.0

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.2.0</version>
</dependency>
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.2.0</version>
</dependency>

注:

????????我們這里使用的是jdk17+springboot3.5.0?環境,原來swaggerV2V3都不能用了,小伙伴們一定更要注意這兒

不能引入的依賴

????????如果引入上面錯誤的依賴,項目啟動會報下面錯誤,這時候我們引入上面正確的依賴重新啟動項目即可

報錯信息

SpringDoc(推薦)

????????SpringDoc 對應坐標是 springdoc-openapi-ui,它是一個集成 Swagger UI 和 ReDoc 的接口文檔生成工具,在使用上與 springfox-boot-starter 類似,但提供了更為靈活、功能更加強大的工具。

????????其中除了可以生成 Swagger UI 風格的接口文檔,還提供了 ReDoc 的文檔渲染方式,可以自動注入 OpenAPI 規范的 JSON 描述文件,支持 OAuth2、JWT 等認證機制,并且支持全新的 OpenAPI 3.0 規范

SpringBoot 3 集成 Swagger3.0

????????需要注意的是,我們一般不會選擇原生的 Swagger maven 坐標來集成 Swagger。而是通過 springdoc-openapi-ui 的 Maven 坐標。

????????它可以很好的和 Spring 或 SpringBoot 項目集成;這個坐標也被 Spring 社區廣泛支持和認可,并被認為是集成 Swagger UI 和 OpenAPI 規范的一個優秀選擇。

引入 Maven

在該示例中,我使用 Spring Boot 3.0.2 集成 Swagger 3.0。

????????springdoc-openapi-starter-webmvc-ui:目前最新版本是 2.6.0,適用于 Spring Boot 3.x 和 Spring Framework 6。支持 Jakarta 命名空間(例如,jakarta.validation),適合 Spring Boot 3 的 Jakarta EE 轉換。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

配置 SwaggerOpenApiConfig

我們通過配置類的方式創建一個 OpenAPI 的 Bean 對象就可以創建 Swagger3.0 的文檔說明。

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class Swagger3Config {@Beanpublic OpenAPI springShopOpenAPI() {return new OpenAPI().info(new Info().title("碼哥跳動 Swagger3 詳解").description("Swagger3 Spring Boot 3.0 application").version("v0.0.1").license(new License().name("Apache 2.0").url("http://springdoc.org"))).externalDocs(new ExternalDocumentation().description("swagger 3 詳解").url("https://springshop.wiki.github.org/docs"));}}

????????OpenAPI 對象是 Swagger 中的核心類之一,用于描述整個 API 的結構和元數據。

????????Swagger2 和 Swagger3 使用的是完全不同的兩套注解,所以原本使用 Swagger2 相關注解的代碼頁需要完全遷移,改為使用 Swagger3 的注解。

Swagger2

Swagger3

@Api

@Tag

@ApiOperation

@Operation

@ApiImplicitParams

@Parameters

@ApiImplicitParam

@Parameter

@ApiModel

@Schema

@ApiModelProperty

@Schema

@ApiResponses

@ApiResponses

@ApiResponse

@ApiResponse

@ApiIgnore

@Hidden 或者 其他注解的 hidden = true 屬性

配置文件

????????通過以下配置來控制 swagger 的開關和訪問地址:WEB 界面的顯示基于解析 JSON 接口返回的結果, 如果 api-docs 關閉, swagger-ui 即使 enable 也無法使用。

server:port: 8013spring:application:name: magebyte-swaggerspringdoc:api-docs:enabled: true # 開啟OpenApi接口path: /v3/api-docs  # 自定義路徑,默認為 "/v3/api-docs"swagger-ui:enabled: true # 開啟swagger界面,依賴OpenApi,需要OpenApi同時開啟path: /swagger-ui.html # 自定義路徑,默認為"/swagger-ui/index.html"# Packages to include,多個用 , 分割packagesToScan: zero.magebyte.magebyte.swagger.controller

需要注意的是,packagesToScan 用于指定 Controller 接口包路徑。

@Schema

Swagger3 用 @Schema 注解對象和字段, 以及接口中的參數類型。

@Setter
@Getter
@Schema(description = "響應返回數據對象")
public class Result<T> implements Serializable {@Schema(title = "code",description = "響應碼",format = "int32",requiredMode = Schema.RequiredMode.REQUIRED)private Integer code;@Schema(title = "msg",description = "響應信息",accessMode = Schema.AccessMode.READ_ONLY,example = "成功或失敗",requiredMode = Schema.RequiredMode.REQUIRED)private String message;@Schema(title = "data", description = "響應數據", accessMode = Schema.AccessMode.READ_ONLY)private T data;
}

返回對象定義

@Data
@AllArgsConstructor
@Schema(title = "學生模型VO", description = "響應視圖學生模型VO")
public class StudentVO implements Serializable {@Schema(name = "學生ID", description = "學生ID屬性", format = "int64", example = "1")private Long id;            // 學生ID@Schema(name = "學生姓名", description = "學生姓名屬性", example = "jack")private String name;        // 學生姓名@Schema(name = "學生年齡", description = "學生年齡屬性", format = "int32", example = "24")private Integer age;        // 學生年齡@Schema(name = "學生地址", description = "學生地址屬性", example = "安徽合肥")private String address;     // 學生地址@Schema(name = "學生分數", description = "學生分數屬性", format = "double", example = "55.50")private Double fraction;    // 學生分數@Schema(name = "學生愛好", description = "學生愛好屬性(List類型)",type = "array", example = "[\"玩\", \"寫字\"]")private List<String> likes; // 學生愛好
}

@Paramete

@Parameter 注解用于描述方法參數。如果不希望顯示某個參數, 用@Parameter(hidden = true)修飾。

@Parameters({@Parameter(name = "currentPage", description = "當前頁碼", required = true),@Parameter(name = "size", description = "當前頁大小", example = "10"),@Parameter(name = "queryUser", description = "用戶查詢條件")
})

Controller 接口定義

啟動項目,打開鏈接:http://localhost:8013/swagger-ui/index.html

@RestController
@RequestMapping("/students")
@Tag(name = "StudentControllerAPI", description = "學生控制器接口", externalDocs = @ExternalDocumentation(description = "這是一個接口文檔介紹"))
public class StudentController {@Operation(summary = "根據Id查詢學生信息", description = "根據ID查詢學生信息,并返回響應結果信息",parameters = {@Parameter(name = "id", description = "學生ID", required = true, example = "1")},responses = {@ApiResponse(responseCode = "200",description = "響應成功",content = @Content(mediaType = "application/json",schema = @Schema(title = "Resul和StudentVO組合模型",description = "返回實體,AjaxResult內data為StudentVO模型",anyOf = {Result.class, StudentVO.class}))),@ApiResponse(responseCode = "500",description = "響應失敗",content = @Content(mediaType = "application/json",schema = @Schema(title = "Resul模型",description = "返回實體,Result內 data為空",implementation = Result.class)))})@GetMapping("/{id}")public Result<StudentVO> findOneStudent(@PathVariable(value = "id") Long id) {//模擬學生數據List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");StudentVO studentVO = new StudentVO(id, "張三", 22, "惠州", 93.5, likes);return new Result<StudentVO>(200, "成功", studentVO);}@Operation(summary = "查詢全部學生數據",description = "查詢學生信息,并返回響應結果信息",responses = {@ApiResponse(responseCode = "200",description = "響應成功",content = @Content(mediaType = "application/json",schema = @Schema(title = "AjaxResul和StudentVO組合模型",description = "返回實體,Result內data為StudentVO模型(并且StudentVO為集合)",anyOf = {Result.class, StudentVO.class})))})@GetMapping("/lists")public Result<List<StudentVO>> findAllStudent() {//模擬學生數據List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");StudentVO student1 = new StudentVO(1L, "張三", 22, "深圳", 93.5, likes);StudentVO student2 = new StudentVO(2L, "李四", 24, "惠州", 99.5, likes);return new Result(200, "成功", Arrays.asList(student1, student2));}@Operation(summary = "學生查詢接口", description = "學生查詢接口")@GetMapping("/query")public Result<List<StudentVO>> queryStudent(QueryStudentDTO queryStudentDTO) {//模擬學生數據List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");StudentVO student1 = new StudentVO(1L, "張三", 22, "廣東深圳", 93.5, likes);StudentVO student2 = new StudentVO(2L, "李四", 24, "廣東惠州", 99.5, likes);return new Result<List<StudentVO>>(200, "成功", Arrays.asList(student1, student2));}@Operation(summary = "學生添加接口", description = "學生添加接口")@PostMappingpublic Result saveStudent(@RequestBody StudentDTO studentDTO) {System.out.println("成功添加數據:" + studentDTO);return new Result(200, "成功", null);}}

參考資料

  1. Spring Boot 3.x 中使用 SpringDoc 2 / Swagger3(詳解)-騰訊云開發者社區-騰訊云
  2. SpringBoot3整合SpringDoc實現在線接口文檔 - 程序員曉凡 - 博客園
  3. https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/
  4. https://springdoc.org/#getting-started
  5. https://springdoc.org/#migrating-from-springfox
  6. https://www.cnblogs.com/antLaddie/p/17418078.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91226.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

@RefreshScope 核心原理深度解析:Spring Boot 的動態魔法

讓我們通過全新的原理圖解和代碼級分析&#xff0c;揭開RefreshScope實現配置熱更新的神秘面紗&#xff01;一、工作原理全景圖&#xff08;優化版&#xff09; #mermaid-svg-50lhLlOFeSRIWnLn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px…

萬字詳解——OSI七層模型:網絡通信的完整架構解析

OSI七層模型&#xff1a;網絡通信的完整架構解析OSI&#xff08;Open Systems Interconnection&#xff09;七層模型是計算機網絡領域最基礎、最權威的參考框架。它由國際標準化組織&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在為不同廠商、不同技術的網絡設備和系…

一個人開發一個App(OpenApi)

為了少寫代碼&#xff0c;統一前后端的網絡層&#xff0c;我使用了OpenApi設計restful接口。然后用openapi-generator來生成flutter的代碼。生成go代碼用的是oapi-codegen,它對go更友好一些。 我們直接在api.yml中設計接口&#xff0c;所有的返回值與請求者都提取到components里…

光伏氣象監測系統:助力光伏發電的智慧大腦

光伏氣象監測系統&#xff1a;助力光伏發電的智慧大腦 柏峰【BF-GFQX】在全球積極推動能源轉型、大力倡導 “雙碳” 目標的當下&#xff0c;光伏發電憑借其清潔、可再生的顯著優勢&#xff0c;宛如一顆冉冉升起的新星&#xff0c;在能源領域迅速嶄露頭角&#xff0c;得以廣泛推…

SpringCloud01——項目演變、微服務遠程調用三種方式、springcloud介紹、nacos注冊中心

目錄 一、項目架構演變過程 1、單體應用架構 2、垂直應用架構 3、分布式服務架構 4、流動計算架構&#xff08;SOA架構&#xff09; 5、微服務架構 二、如何實現微服務遠程調用 1、HttpClient工具類&#xff08;springboot中&#xff09; 形式1&#xff1a;調用第三方…

Oracle 和 MySQL 中的日期類型比較

Oracle 和 MySQL 都提供了多種日期和時間數據類型&#xff0c;但它們在實現和功能上有一些差異。以下是兩者的主要日期類型對比&#xff1a;Oracle 日期類型DATE存儲日期和時間&#xff08;精確到秒&#xff09;格式&#xff1a;YYYY-MM-DD HH24:MI:SS示例&#xff1a;TO_DATE(…

基于 Redis 實現共享 Session 登錄的多種方法與實踐

全文目錄&#xff1a;開篇語**前言****1. 什么是共享 Session 登錄&#xff1f;****2. 基于 Redis 實現共享 Session 的基本方法****2.1 通過 Redis 存儲 Session 數據****2.1.1 基本流程****2.1.2 示例代碼&#xff08;Java Spring Boot Redis&#xff09;****3. 使用 Redis…

spring cloud + easyRules 零基礎搭建智能規則引擎

你是否曾想過在項目中嵌入一套輕量級且高度可擴展的規則引擎&#xff0c;輕松實現動態化的業務決策&#xff1f;在金融、電商、政務等領域&#xff0c;風險控制是業務安全的核心。傳統硬編碼方式很難應對復雜多變的風控需求&#xff0c;而規則引擎允許我們將這些規則獨立出來&a…

AI應用:電路板設計

Diode Computers 公司 Diode Computers是一家專注于利用AI技術進行定制電路板設計和制造的公司&#xff0c;提供從概念到量產的全流程服務。其核心優勢在于將電路板設計轉化為AI可理解的代碼形式&#xff0c;大幅提升設計效率并降低傳統EDA工具的使用門檻 0。 核心服務 設計與制…

RocketMQ學習系列之——客戶端消息確認機制

一、客戶端使用MQ基本代碼示例1、添加maven依賴<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version> </dependency>2、生產者代碼示例public class Produc…

[leetcode] 組合總和

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; i class Solution {int aim;vector<vector<int>> ret;vector<int> path; public:vector<vector<int>> combinationSum(vector<int>& nums, int target) {aim target;dfs(nums…

新能源行業B端極簡設計:碳中和目標下的交互輕量化實踐

新能源行業B端極簡設計&#xff1a;碳中和目標下的交互輕量化實踐內容摘要在新能源行業&#xff0c;碳中和目標正推動著企業追求更高的運營效率和更低的資源消耗。然而&#xff0c;傳統的B端交互設計往往復雜繁瑣&#xff0c;不僅增加了用戶的操作成本&#xff0c;還可能導致資…

減速機:自動化生產線的“精密傳動心臟”

減速機作為自動化生產線的核心傳動部件&#xff0c;通過調節轉速與扭矩實現設備精準控制&#xff0c;其在自動化生產線中發揮著關鍵作用。以下是其具體應用方式&#xff1a;輸送線驅動在自動化生產線中&#xff0c;輸送線用于運輸物料、半成品或成品&#xff0c;通過減速機可以…

從0到1學PHP(五):PHP 數組:高效存儲與處理數據

目錄一、數組的定義與分類1.1 索引數組1.2 關聯數組1.3 多維數組二、數組的基本操作2.1 數組元素的添加、刪除、修改和訪問2.2 數組指針的操作三、數組處理函數3.1 數組排序函數3.2 數組統計函數3.3 數組過濾與轉換函數一、數組的定義與分類 在 PHP 中&#xff0c;數組是一種非…

vscode 字體的跟換

打開vscode 左下角輸入電腦中已經有的字體&#xff1a;有想要用的可以自己進行安裝刷新這樣就可改變了

墨者:SQL過濾字符后手工注入漏洞測試(第3題)

1. 墨者學院&#xff1a;SQL過濾字符后手工注入漏洞測試(第3題)&#x1f680; 因為練習過太多的sql注入&#xff0c;廢話不多介紹&#xff0c;我會通過圍繞手動注入和工具爆破的方式達到靶場目標&#xff0c;開練&#xff01;&#xff01;&#xff01; 2. 手工注入方式&#x1…

【Spring AI實戰】實現仿DeepSeek頁面對話機器人(支持多模態上傳)

一、前言 二、實現效果 三、代碼實現 3.1 后端代碼 3.2 前端代碼 一、前言 Spring AI詳解&#xff1a;【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 可上傳圖片或音頻數據給大模型分析 三、代碼實現 3.1 后…

Vue 正在熱映模塊

Vue 漸進式JavaScript 框架 基于Vue2的移動端項目&#xff1a;正在熱映模塊 目錄 正在熱映 數據修改 導入axios 配置反向代理 正在熱映渲染 賦值數據 渲染列表 顯示圖片 優化列表 設置列表樣式 主演 定義過濾器 使用過濾器 主演過長處理 無主演情況處理 觀眾評…

阿里云上進行k8s集群的配置

在阿里云容器服務Kubernetes&#xff08;ACK&#xff09;中配置集群的核心步驟可分為以下六大關鍵環節&#xff0c;涵蓋架構設計到運維管理&#xff1a;1. 集群規劃與基礎配置 集群類型選擇 托管版&#xff1a;Master節點由阿里云托管&#xff08;推薦生產環境&#xff09;專有…

頁面性能優化

優化點解決方案效果雙向綁定數量過多競對設置單元格內部涉及雙向綁定的輸入組件過多&#xff0c;線上頁面最多有88個該和抽屜中的編輯表格一樣的組件&#xff0c;共計930個&#xff08;按每行最少6個來計算的&#xff09;雙向綁定的組件&#xff0c;嚴重拖累頁面性能。數據計算…