跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

Spring Boot 3 整合 Knife4j (Swagger3) 关键点梳理

Spring Boot 3 整合 Knife4j 需选用兼容 Jakarta 的依赖包 knife4j-openapi3-jakarta-spring-boot-starter。配置过程涉及 OpenAPI Bean 定义、分组扫描及全局响应码自定义。常见问题包括全局异常处理器覆盖接口响应导致 NoSuchMethodError,以及 Knife4jProperties Bean 冲突。解决方案包括在 application.yml 中设置 springdoc.override-with-generic-response 为 false,并确保编译参数包含 -parameters。此外需注意 Swagger UI 路径配置及文档分组展示细节。

1951018925发布于 2026/3/15更新于 2026/7/2341 浏览

引言

使用 JDK 21 版本的 Spring Boot 项目,在整合 Swagger3 过程中遇到一些问题。网上很多关于 Spring Boot 3 整合 Knife4j 的步骤完全照着做会有问题,现将遇到的问题做记录。

Spring Boot 3 整合 Knife4j (Swagger3) 关键点梳理

1. 添加/修改依赖

Spring Boot 3.x 必须使用 knife4j-openapi3-jakarta(Jakarta 命名空间)。

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.5.0</version>
</dependency>

网上很多文章建议使用旧版 knife4j-spring-boot-starter,但在实际调试中会遇到很多问题,建议优先选择 Spring Boot 3.x 版本兼容的 Knife4j 版本。

2. 添加配置文件

需要配置 OpenAPI Bean 及分组扫描路径。

package com.Knife4j;

import io.swagger.v3.oas.models.OpenAPI;
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 org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springdoc.core.models.GroupedOpenApi;

@Configuration
public class Knife4jConfig {

    private static final String SERVICE_URL  ;
          ;
          ;
          ;
          ;
          ;
          ;

    
     GroupedOpenApi  {
         GroupedOpenApi.builder()
                .group()
                .displayName()
                .packagesToScan()
                .addOpenApiCustomizer(::setCustomStatusCode)
                .build();
    }

    
     GroupedOpenApi  {
         GroupedOpenApi.builder()
                .group()
                .displayName()
                .packagesToScan()
                .addOpenApiCustomizer(::setCustomStatusCode)
                .build();
    }

    
     GroupedOpenApi  {
         GroupedOpenApi.builder()
                .group()
                .displayName()
                .packagesToScan()
                .addOpenApiMethodFilter(method -> method.isAnnotationPresent(io.swagger.v3.oas.annotations.Operation.class))
                .addOpenApiCustomizer(::setCustomStatusCode)
                .build();
    }

    
     OpenAPI  {
          ()
                .info( ()
                        .title(API_INFO_TITLE)
                        .description(API_INFO_DESCRIPTION)
                        .version(API_INFO_VERSION)
                        .contact( ().name(API_INFO_NAME).email(API_INFO_EMAIL))
                        .license( ().name(API_INFO_LICENSE).url(SERVICE_URL)));
    }

       {
         (openApi.getPaths() != ) {
             ( entry : openApi.getPaths().entrySet()) {
                   entry.getValue();
                   Map.of(
                    , pathItem.getPut(),
                    , pathItem.getGet(),
                    , pathItem.getDelete(),
                    , pathItem.getPost()
                );
                operationMap.forEach((k, v) -> {
                     (v != ) v.setResponses(handleResponses(v.getResponses()));
                });
            }
        }
    }

     ApiResponses  {
            ();
         ( entry : responses.entrySet()) {
             (entry.getValue() != ) {
                content = entry.getValue().getContent();
                ;
            }
        }
        Map<Integer, String> map = StatusCode.toMap();
         ( entry : map.entrySet()) {
                ();
            api.setContent(content);
            api.description(entry.getValue());
            responses.addApiResponse(entry.getKey() + , api);
        }
         responses;
    }

    
     GlobalOpenApiCustomizer  {
         openApi -> {
             (openApi.getTags() != ) {
                openApi.getTags().forEach(tag -> {
                    Map<String, Object> map =  <>();
                    map.put(, ); 
                    tag.setExtensions(map);
                });
            }
             (openApi.getPaths() != ) {
                openApi.addExtension(, );
                openApi.getPaths().addExtension(, );
            }
        };
    }
}
=
"http://127.0.0.1:8886/doc.html"
private
static
final
String
API_INFO_TITLE
=
"软件接口文档"
private
static
final
String
API_INFO_VERSION
=
"V1.0"
private
static
final
String
API_INFO_DESCRIPTION
=
"Api 接口列表"
private
static
final
String
API_INFO_LICENSE
=
"2025 年度内部文档,违拷必究."
private
static
final
String
API_INFO_EMAIL
=
"[email protected]"
private
static
final
String
API_INFO_NAME
=
"zpp"
@Bean
public
api4
()
return
"regularGrade-module-api"
"平时成绩模块接口"
"com.call.controller.regularGrade"
this
@Bean
public
api3
()
return
"IntelligentScoring-module-api"
"智能评分模块接口"
"com.call.controller.intelligentScoring"
this
@Bean
public
api2
()
return
"aiagent-module-api"
"AI 大模型 Agent 接口"
"com.ai.LangChain4j.agent2.DeclarativeAPI"
this
@Bean
public
openAPI
()
return
new
OpenAPI
new
Info
new
Contact
new
License
private
void
setCustomStatusCode
(OpenAPI openApi)
if
null
for
var
var
pathItem
=
var
operationMap
=
"put"
"get"
"delete"
"post"
if
null
private
handleResponses
(ApiResponses responses)
Content
content
=
new
Content
for
var
if
null
break
for
var
ApiResponse
api
=
new
ApiResponse
""
return
@Bean
public
orderGlobalOpenApiCustomizer
()
return
if
null
new
HashMap
"x-order"
10
// 示例值,原 RandomUtil 逻辑需引入 hutool
if
null
"x-test123"
"333"
"x-abb"
50

3. 启动 Spring Boot

启动成功后,访问 http://127.0.0.1:8886/doc.html。

4. 配置项

springdoc:
  override-with-generic-response: false
  remove-broken-reference-definitions: false
swagger-ui:
  path: /doc.html
  tags-sorter: alpha
  operations-sorter: alpha
api-docs:
  path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com
knife4j:
  enable: true
  setting:
    language: zh_cn

5. 高级配置

可配置 Knife4j 的增强功能,如文档分组、语言、认证等。

knife4j:
  enable: true
  documents:
    - group: 2.X 版本
      name: 接口签名
      locations: classpath:sign/*
  setting:
    language: zh-CN
    enable-swagger-models: true
    enable-document-manage: true
    cors: false
    production: false
    basic:
      enable: false
springdoc:
  override-with-generic-response: false

常见问题与解决

问题 1:启动报错 NoSuchMethodError

错误信息:java.lang.NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)'

原因:全局异常处理器的响应定义覆盖了所有接口,导致 Swagger 解析异常。

解决:在 application.yml 中添加以下配置,防止覆盖。

springdoc:
  override-with-generic-response: false
  remove-broken-reference-definitions: false

问题 2:Knife4jProperties Bean 冲突

错误信息:No qualifying bean of type '...Knife4jProperties' available: expected single matching bean but found 2

原因:存在重复的 Bean 定义或编译参数缺失。

解决:确保编译器配置使用 -parameters 标志,并检查是否引入了多个版本的依赖。


注:以上配置基于 Spring Boot 3.4.5 及 Knife4j 4.5.0 环境测试。

目录

  1. 引言
  2. Spring Boot 3 整合 Knife4j (Swagger3) 关键点梳理
  3. 1. 添加/修改依赖
  4. 2. 添加配置文件
  5. 3. 启动 Spring Boot
  6. 4. 配置项
  7. 5. 高级配置
  8. 常见问题与解决
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端开发常被低估?聊聊工程化背后的隐形门槛
  • GPT-4o 多模态交互与端侧应用玩法解析
  • ERNIE-4.5-0.3B 轻量模型部署与实战测评
  • LightGlue ONNX C++ 推理实践
  • 免费 AI API 公益站上线,支持 GPT-4o 等模型
  • MacOS 极简安装 OpenClaw 之 Docker 版
  • Python 函数核心指南:参数传递、返回值与模块使用
  • GitHub Copilot Pro 学生认证与配置指南
  • 前端监控最佳实践与 Sentry 集成
  • OpenClaw 与 ToClaw 横评:AI 代理网关的产品化选型
  • 前端 TypeScript 高级技巧:提升代码安全性
  • Python 在 CentOS 系统上的安装与配置深度指南
  • 前端 DOM 操作核心知识与实战解析
  • 动态规划专题:子序列问题深度解析
  • Linux 下 libwebkit2gtk-4.1-0 安装实战:从零部署 GTK Web 渲染引擎
  • Java 模拟算法实战:LeetCode 经典题型解析
  • IDEA 中 AI 编程插件实测:Copilot、TRAE 与灵码深度对比
  • 常见排序算法详解:冒泡、选择与插入
  • 排查 VS Code Copilot 登录卡顿的几种办法
  • 深度学习训练流程拆解:从数据到参数更新

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online