在 springboot3.x 使用 knife4j 以及常見報錯匯總

目錄

引言:?

引入依賴:?

配置文件:?

過濾靜態資源:

?增強模式:

便捷地址訪問:

常見問題:?

注解使用實例:?


📄 ?文檔參考地址?:
SpringBoot 3.x 結合 Swagger3 (Knife4j )踩坑實錄 - 古渡藍按 - 博客園?🔍

🏛? ?官方文檔地址?:
快速開始 | Knife4j📚

💡 ?背景來源?:
想在微服務項目使用 Knife4j,但是找了很多文檔使用后訪問地址無法顯示 😵。經過實踐和排查,終于解決了問題 ?!

引言:?

首先,重點強調 Spring Boot 3.x 只支持 OpenAPI3 規范:

  • Knife4j提供的starter已經引用springdoc-openapi的jar,開發者需注意避免jar包沖突
  • JDK版本必須 >= 17
  • 詳細Demo請參考knife4j-spring-boot3-demo

在 Spring Boot 3.x 項目中,如果你看到?swagger-annotations?依賴,通常意味著你正在使用 ?Springfox Swagger?(如?springfox-swagger2),而它 ?不兼容 Spring Boot 3.x?(因為 Spring Boot 3 遷移到了 Jakarta EE 9+,而 Springfox 仍依賴舊的?javax.servlet?包)。?

<!-- 刪除這些 Springfox 依賴 -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.10.5</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.10.5</version>
</dependency>

SpringDoc 是 Spring Boot 3.x 的官方推薦替代方案,完全兼容 Jakarta EE 9+:?

Springfox (舊)SpringDoc (新)作用
@Api@Tag類級別的 API 描述
@ApiOperation@Operation方法級別的 API 描述
@ApiParam@Parameter參數描述
@ApiModel@Schema模型描述

所以我們需要更換新的依賴,也就是Knife4j4.x,這樣才能在?Spring Boot 3.x 項目中使用。

引入依賴:?

首先引入依賴:

<!--   添加swagger核心依賴-->
<dependency><groupId>io.swagger.core.v3</groupId><artifactId>swagger-core</artifactId><version>2.2.20</version>
</dependency>
<!--添加knife4j依賴-->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>
<!--添加Springdoc依賴-->
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.2.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
<!--僅添加上述依賴,仍有可能報錯,需補充以下依賴-->
<dependency><groupId>com.fasterxml.jackson.module</groupId><artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId><version>2.13.3</version>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.4.0-b180830.0359</version>
</dependency>

配置文件:?

我們一共要引入三個配置類和一個配置文件:

引入配置文件,這里因為我在開發微服務,所以在bootstrap.yml進行配置,如果正常開發Springboot項目的話,在application.yml配置即可:

盡需改寫文檔掃描包路徑即可,配置成自己項目的controller包路徑。?

server:servlet:context-path: /contentport: 63040# springdoc-openapi項目配置
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaapi-docs:path: /v3/api-docsgroup-configs:- group: 'default'paths-to-match: '/**'# 生成文檔所需的掃包路徑,一般為啟動類目錄packages-to-scan: com.xuecheng.content.api
# knife4j的增強配置,不需要增強可以不配
knife4j:# 是否啟用增強設置enable: true# 是否啟用登錄認證basic:enable: trueusername: adminpassword: 123456setting:language: zh_cnenable-version: trueenable-swagger-models: trueswagger-model-name: 用戶模塊

過濾靜態資源:

Spring MVC配置類,主要用于處理網站圖標(favicon.ico)的請求

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @Classname FaviconConfiguration* @Description 添加配置文件,處理favicon.ico請求* @Version 1.0.0* @Date 2025/5/26 13:39* @Created by Administrator*/
@SpringBootConfiguration
public class FaviconConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new HandlerInterceptor() {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {if (!"GET".equalsIgnoreCase(request.getMethod()) || !request.getRequestURI().toString().equals("/favicon.ico")) {return true;}response.setStatus(HttpStatus.NO_CONTENT.value()); // 設置狀態碼為204 No Contentreturn false;}}).addPathPatterns("/**");}
}

?增強模式:

自定義生成的Swagger/OpenAPI文檔的展示信息,提供一些項目信息或者個人的信息。

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.info.Contact;
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;import java.util.ArrayList;
import java.util.List;/*** Swagger2配置信息* 這里分了兩組顯示* 第一組是api,當作用戶端接口* 第二組是admin,當作后臺管理接口* 也可以根據實際情況來減少或者增加組** @author eleven_lxs* @date 2025-05-26 22:17*/
@Configuration
public class SwaggerConfig {@Beanpublic OpenAPI swaggerOpenAPI(){return new OpenAPI().info(new Info().title("標題")// 信息.contact(new Contact().name("作者").email("郵箱").url("地址"))// 簡介.description("我的API文檔")// 版本.version("v1")// 許可證.license(new License().name("Apache 2.0").url("http://springdoc.org"))).externalDocs(new ExternalDocumentation().description("外部文檔").url("https://springshop.wiki.github.org/docs"));}
}

便捷地址訪問:

?而為了方便直接通過點擊地址直接訪問,我們編寫配置類幫助我們直接訪問:

import io.micrometer.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Optional;/*** @Classname DocumentationConfig* @Description TODO* @Version 1.0.0* @Date 2025/5/26 15:28* @Created by Administrator*/
@Configuration
@Slf4j
public class DocumentationConfig implements ApplicationListener<ApplicationReadyEvent> {@Autowiredprivate Environment env;@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {String protocol = env.getProperty("server.ssl.key-store") != null ? "https" : "http";System.out.println(env);// 獲取端口(添加默認值8080)String serverPort = env.getProperty("server.port", "8000");// 處理contextPath(避免null拼接)String contextPath = Optional.ofNullable(env.getProperty("server.servlet.context-path")).orElse("");String docPath = contextPath + "/doc.html";// 獲取主機地址String hostAddress;try {hostAddress = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {hostAddress = "localhost";log.warn("無法獲取主機IP,使用默認地址: localhost");}log.info("""----------------------------------------------------------\t應用程序 "{}" 已啟動\t文檔訪問地址:\t本地: \t{}://localhost:{}{}\t外部: \t{}://{}:{}{}\t激活配置: \t{}----------------------------------------------------------""",env.getProperty("spring.application.name", "默認應用"),protocol, serverPort, docPath,protocol, hostAddress, serverPort, docPath,Arrays.toString(env.getActiveProfiles()));}
}

常見問題:?

如果是開發微服務,這里可能會出現?http://localhost:63040/doc.html?,這里我的問題是出自在bootstrap.yml是Spring Cloud的配置文件,但在普通Spring Boot應用中不會自動加載,如果想使用,要添加spring-cloud-starter-bootstrap依賴才能生效:

<!-- 使bootstrap.yml生效 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>4.1.5</version> <!-- 與Spring Boot版本匹配 -->
</dependency>

隨后在啟動類下面可以添加代碼進行測試:

@SpringBootApplication
public class ContentApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(ContentApplication.class, args);printEnvInfo(context);}private static void printEnvInfo(ConfigurableApplicationContext context) {Environment env = context.getEnvironment();System.out.println("\n=== 應用配置信息 ===");System.out.println("應用名稱: " + env.getProperty("spring.application.name"));System.out.println("服務端口: " + env.getProperty("server.port"));System.out.println("上下文路徑: " + env.getProperty("server.servlet.context-path"));System.out.println("激活Profile: " + Arrays.toString(env.getActiveProfiles()));System.out.println("數據庫URL: " + env.getProperty("spring.datasource.url"));System.out.println("Swagger路徑: " + env.getProperty("springdoc.swagger-ui.path"));}
}

?而我為了方便,我直接配置了一個新的application.yml,發現一樣好使:

server:port: 63040

另外如果還是沒有顯示,那么去檢查你的 SecurityConfig?配置,確保?SecurityConfig 放行所有文檔路徑:

@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/content/swagger-ui/?**?","/content/v3/api-docs/?**?","/content/doc.html","/content/webjars/?**?").permitAll().anyRequest().authenticated());return http.build();}
}

注解使用實例:?

import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.content.model.dto.QueryCourseParamsDto;
import com.xuecheng.content.model.po.CourseBase;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@Tag(name = "課程信息管理接口", description = "課程信息管理接口")  // 替代 @Api
@RestController
public class CourseBaseInfoController {@Operation(summary = "課程查詢接口")  // 替代 @ApiOperation@PostMapping("/course/list")public PageResult<CourseBase> list(@Parameter(description = "分頁參數") PageParams pageParams,  // 替代 @ApiParam@Parameter(description = "查詢條件") @RequestBody(required = false) QueryCourseParamsDto queryCourseParamsDto) {CourseBase courseBase = new CourseBase();courseBase.setName("測試名稱");courseBase.setCreateDate(LocalDateTime.now());List<CourseBase> courseBases = new ArrayList<>();courseBases.add(courseBase);return new PageResult<>(courseBases, 10, 1, 10);}
}
import lombok.Data;
import lombok.ToString;
import io.swagger.v3.oas.annotations.media.Schema;@Data
@ToString
@Schema(name = "PageParams", description = "分頁查詢參數") // 類級別描述(可選)
public class PageParams {@Schema(description = "頁碼", example = "1", defaultValue = "1")private Long pageNo = 1L;@Schema(description = "每頁記錄數", example = "30", defaultValue = "30")private Long pageSize = 30L;public PageParams() {}public PageParams(Long pageNo, Long pageSize) {this.pageNo = pageNo;this.pageSize = pageSize;}
}

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

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

相關文章

【C/C++】環形緩沖區:高效數據流轉核心

文章目錄 1 核心結構與原理1.1 組成1.2 內存布局1.3 關鍵操作 2 實現細節與優化2.1 滿/空狀態的判斷2.2 多線程安全&#xff08;無鎖實現&#xff09;2.3 性能優化 3 典型應用場景4 代碼示例5 優缺點6 對比7 進階 環形緩沖區&#xff08;Ring Buffer&#xff09;&#xff0c;又…

功耗僅4W!迷你服務器黑豹X2(Panther X2)卡刷、線刷刷入Armbian(ubuntu)系統教程

功耗僅4W&#xff01;迷你服務器黑豹X2&#xff08;Panther X2&#xff09;卡刷、線刷刷入Armbian&#xff08;ubuntu&#xff09;系統教程 前言 前段時間逛海鮮市場的時候留意到一個礦渣盒子&#xff0c;黑豹x2&#xff0c;又是一個類似迅雷賺錢寶這樣的挖礦項目已經gg的定制…

【Elasticsearch】更新操作原理

Elasticsearch 的更新操作&#xff08;如 _update 和 _update_by_query&#xff09;在底層實現上有一些復雜的原理&#xff0c;這些原理涉及到 Elasticsearch 的數據存儲機制、索引機制以及事務日志&#xff08;Translog&#xff09;的使用。以下是 Elasticsearch 更新操作的主…

【C++】紅黑樹的實現

目錄 前言 一、紅黑樹的概念 二、紅黑樹的實現 三、紅黑樹的查找 四、紅黑樹的驗證 五、紅黑樹的刪除 總結 前言 本文講解紅黑樹&#xff0c;主要講解插入部分的實現&#xff0c;建議在理解了AVL樹的旋轉后再來學習紅黑樹&#xff0c;因為紅黑樹也涉及旋轉&#xff0c;并…

IPv4地址的主要配置項介紹

1. IPv4 主要配置項 (1) IP 地址&#xff08;IP Address&#xff09; 作用&#xff1a;唯一標識網絡中的設備&#xff08;如 192.168.1.100&#xff09;。分類&#xff1a; 靜態 IP&#xff1a;手動配置&#xff0c;適用于服務器、打印機等固定設備。動態 IP&#xff08;DHCP…

nginx 基于IP和用戶的訪問

nginx的下載 yum install nginx.x86_64 -y 啟動服務 systemctl enable --now nginx.service 查看服務目錄 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…

Debian操作系統全面解析:從起源到應用

Debian 操作系統全面解析:從起源到應用 在開源操作系統的廣袤天地中,Debian 占據著極為重要的地位。它憑借自身諸多突出特性,吸引了全球無數用戶與開發者的目光,從個人桌面應用到大型服務器部署,從普通辦公場景到專業科研領域,Debian 都展現出了強大的適應性與可靠性,為…

【springMVC】springMVC學習系列一:springMVC的組件

系列文章目錄 前言 spring mvc 它解決了什么問題呢&#xff1f; 1.URL映射 2. 表單參數映射 3. 調用目標Control 4. 數據模型映射 5. 視圖解析 6. 異常處理 上述解決在spring mvc 中都體現在如下組件當中 HandlerMapping&#xff1a; url與控制器的映謝 HandlerAdapter&#…

【Vue Vapor Mode :技術突破與性能優化的可能性】

Vue Vapor Mode &#xff1a;技術突破與性能優化的可能性 前言 作為一名有著Vue 2經驗和Vue 3經驗的開發者&#xff0c;你一定深刻體會過Vue從Options API到Composition API的演進&#xff0c;也感受過Vue 3在性能上相比Vue 2的顯著提升。現在&#xff0c;Vue團隊正在開發一個…

MySQL數據庫零基礎入門教程:從安裝配置到數據查詢全掌握【MySQL系列】

第1章&#xff1a;認識MySQL 1.1 什么是MySQL&#xff1f; MySQL是一種開源的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司開發&#xff0c;現由Oracle公司維護。它使用結構化查詢語言&#xff08;SQL&#xff09;進行數據庫的管理和操…

AXI3、AXI4 和 AXI5 的詳細差異對比

AXI3、AXI4 和 AXI5 的詳細差異對比 摘要&#xff1a;AXI (Advanced eXtensible Interface) 是 ARM 公司提出的高性能片上總線協議&#xff0c;廣泛用于 SoC (System on Chip) 設計中&#xff0c;以實現高效的數據傳輸和系統互連。AXI 協議隨著版本的迭代不斷演進&#xff0c;從…

向量數據庫該如何選擇?Milvus 、ES、OpenSearch 快速對比:向量搜索能力與智能檢索引擎的應用前景

? 1.milvus VS ES Milvus 的亮點 功能性&#xff1a;Milvus 不僅支持基本的向量相似性搜索&#xff0c;還支持稀疏向量、批量向量、過濾搜索和混合搜索功能等高級功能。 靈活性&#xff1a;Milvus 支持多種部署模式和多個 SDK&#xff0c;所有這些都在一個強大的集成生態系…

SQL進階之旅 Day 4:子查詢與臨時表優化

文章標題 【SQL進階之旅 Day 4】子查詢與臨時表優化 文章內容 開篇&#xff1a;SQL進階之旅的第4天 在“SQL進階之旅”系列中&#xff0c;第4天的主題是子查詢與臨時表優化。這是SQL開發中不可或缺的一部分&#xff0c;尤其在處理復雜查詢時&#xff0c;合理使用子查詢和臨…

Python學習(2) ----- Python的類型

在 Python 中&#xff0c;一切皆對象&#xff0c;每個對象都有類型。下面是 Python 中的常見內置類型分類和示例&#xff1a; &#x1f7e1; 1. 數字類型&#xff08;Numeric Types&#xff09; 類型說明示例int整數5, -42float浮點數3.14, -0.5complex復數1 2j a 10 …

跨協議協同智造新實踐:DeviceNet-EtherCAT網關驅動汽車焊接裝配效能躍遷

在汽車制造領域&#xff0c;機器人協作對于提升生產效率與產品質量至關重要。焊接、裝配等關鍵環節&#xff0c;需要機器人與各類設備緊密配合。JH-DVN-ECT疆鴻智能的devicenet從站轉ethercat主站協議網關&#xff0c;成為實現這一高效協作的得力助手&#xff0c;尤其是在連接歐…

nginx之proxy_buffering的作用

Nginx 的緩沖機制是為了讓后端能更快釋放資源&#xff0c;而不是卡在慢客戶端上&#xff0c;從而提升整體性能和并發能力。 現實中客戶端和后端服務器之間的傳輸速率可能差異很大。Nginx 的緩沖機制正是為了解決這個不匹配問題。 假設沒有緩沖&#xff08;即 proxy_buffering…

數據庫相關問題

1.保留字 1.1錯誤案例&#xff08;2025/5/27&#xff09; 報錯&#xff1a; java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near condition, sell…

GO 語言進階之 進程 OS與 編碼,數據格式轉換

更多個人筆記見&#xff1a; github個人筆記倉庫 gitee 個人筆記倉庫 個人學習&#xff0c;學習過程中還會不斷補充&#xff5e; &#xff08;后續會更新在github上&#xff09; 文章目錄 進程信息OS操作基本例子 編碼相關HASH 哈希Base64 encoding 基礎64編碼 數據格式轉換和處…

如何用Spring Cache實現對Redis的抽象

我們在進行Java項目開發時候&#xff0c;經常會用到Redis緩存例如數據庫里的一些信息、手機驗證碼之類的&#xff0c;正常寫法就會像去連mysql一樣&#xff0c;這種硬編碼的方式肯定是非常不合適的。 Autowireprivate UserMapper userMapper;Autowireprivate StringCommand str…

CMake指令:file()

目錄 1.簡介 2.常用子命令&#xff08;COMMAND&#xff09; 2.1.COPY - 復制文件或目錄 2.2.RENAME - 重命名文件或目錄 2.3.REMOVE - 刪除文件或目錄 2.4.MAKE_DIRECTORY - 創建目錄 2.5.READ - 讀取文件內容 2.6.WRITE - 寫入文件內容 2.7.GLOB - 按模式匹配文件 2…