当前位置: 首页 > article >正文

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖,如果有的话删除,加入以下依赖

<!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifactId><version>${knife4j.version}</version><exclusions><exclusion><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-webmvc-core</artifactId></exclusion><exclusion><groupId>io.springfox</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>${springdoc.version}</version></dependency></dependencies>

然后在下面文件中加入配置初始化语句:

#################### 接口文档配置 ####################
springdoc.api-docs.enabled= true
springdoc.api-docs.path= /v3/api-docs
springdoc.swagger-ui.enabled= true
springdoc.swagger-ui.path= /swagger-ui
springdoc.default-flat-param-object= trueknife4j.enable= false
knife4j.setting.language= zh_cn

新建swagger的config类,内容如下:

SwaggerProperties
package com.todod.config.swagger;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;import javax.validation.constraints.NotEmpty;/*** Swagger 配置属性** @author admin*/
@ConfigurationProperties("base.swagger")
@Data
public class SwaggerProperties {/*** 标题*/@NotEmpty(message = "标题不能为空")private String title;/*** 描述*/@NotEmpty(message = "描述不能为空")private String description;/*** 作者*/@NotEmpty(message = "作者不能为空")private String author;/*** 版本*/@NotEmpty(message = "版本不能为空")private String version;/*** url*/@NotEmpty(message = "扫描的 package 不能为空")private String url;/*** email*/@NotEmpty(message = "扫描的 email 不能为空")private String email;/*** license*/@NotEmpty(message = "扫描的 license 不能为空")private String license;/*** license-url*/@NotEmpty(message = "扫描的 license-url 不能为空")private String licenseUrl;}
BaseSwaggerAutoConfiguration
package com.todod.config.swagger;import io.swagger.v3.oas.models.Components;
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 io.swagger.v3.oas.models.media.IntegerSchema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.*;
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
import org.springdoc.core.providers.JavadocProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpHeaders;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;/*** Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。** 友情提示:* 1. Springdoc 文档地址:<a href="https://github.com/springdoc/springdoc-openapi">仓库</a>* 2. Swagger 规范,于 2015 更名为 OpenAPI 规范,本质是一个东西** @author admin*/
@Configuration
@ConditionalOnClass({OpenAPI.class})
@EnableConfigurationProperties(SwaggerProperties.class)
@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用
public class BaseSwaggerAutoConfiguration {public static final String HEADER_TENANT_ID = "tenant-id";// ========== 全局 OpenAPI 配置 ==========@Beanpublic OpenAPI createApi(SwaggerProperties properties) {Map<String, SecurityScheme> securitySchemas = buildSecuritySchemes();OpenAPI openAPI = new OpenAPI()// 接口信息.info(buildInfo(properties))// 接口安全配置.components(new Components().securitySchemes(securitySchemas)).addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));securitySchemas.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key)));return openAPI;}/*** API 摘要信息*/private Info buildInfo(SwaggerProperties properties) {return new Info().title(properties.getTitle()).description(properties.getDescription()).version(properties.getVersion()).contact(new Contact().name(properties.getAuthor()).url(properties.getUrl()).email(properties.getEmail())).license(new License().name(properties.getLicense()).url(properties.getLicenseUrl()));}/*** 安全模式,这里配置通过请求头 Authorization 传递 token 参数*/private Map<String, SecurityScheme> buildSecuritySchemes() {Map<String, SecurityScheme> securitySchemes = new HashMap<>();SecurityScheme securityScheme = new SecurityScheme().type(SecurityScheme.Type.APIKEY) // 类型.name(HttpHeaders.AUTHORIZATION) // 请求头的 name.in(SecurityScheme.In.HEADER); // token 所在位置securitySchemes.put(HttpHeaders.AUTHORIZATION, securityScheme);return securitySchemes;}/*** 自定义 OpenAPI 处理器*/@Bean@Primary // 目的:以我们创建的 OpenAPIService Bean 为主,避免一键改包后,启动报错!public OpenAPIService openApiBuilder(Optional<OpenAPI> openAPI,SecurityService securityParser,SpringDocConfigProperties springDocConfigProperties,PropertyResolverUtils propertyResolverUtils,Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,Optional<JavadocProvider> javadocProvider) {return new OpenAPIService(openAPI, securityParser, springDocConfigProperties,propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);}// ========== 分组 OpenAPI 配置 ==========/*** 所有模块的 API 分组*/@Beanpublic GroupedOpenApi allGroupedOpenApi() {return buildGroupedOpenApi("all", "");}public static GroupedOpenApi buildGroupedOpenApi(String group) {return buildGroupedOpenApi(group, group);}public static GroupedOpenApi buildGroupedOpenApi(String group, String path) {return GroupedOpenApi.builder().group(group).pathsToMatch("/admin-api/" + path + "/**", "/" + path + "/**").addOperationCustomizer((operation, handlerMethod) -> operation.addParametersItem(buildTenantHeaderParameter()).addParametersItem(buildSecurityHeaderParameter())).build();}/*** 构建 Tenant 租户编号请求头参数** @return 多租户参数*/private static Parameter buildTenantHeaderParameter() {return new Parameter().name(HEADER_TENANT_ID) // header 名.description("租户编号") // 描述.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header.schema(new IntegerSchema()._default(1L).name(HEADER_TENANT_ID).description("租户编号")); // 默认:使用租户编号为 1}/*** 构建 Authorization 认证请求头参数** 解决 Knife4j <a href="https://gitee.com/xiaoym/knife4j/issues/I69QBU">Authorize 未生效,请求header里未包含参数</a>** @return 认证参数*/private static Parameter buildSecurityHeaderParameter() {return new Parameter().name(HttpHeaders.AUTHORIZATION) // header 名.description("认证 Token") // 描述.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header.schema(new StringSchema()._default("Bearer test1").name(HEADER_TENANT_ID).description("认证 Token")); // 默认:使用用户编号为 1}}

新建WebAppConfig类来控制./doc.html可以访问

代码如下:

package com.todod.config;import com.todod.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.concurrent.TimeUnit;@Configuration
public class WebAppConfig implements WebMvcConfigurer {@Value("${file.upload.path}")private String uploadPath; // 文件路径@Value("${file.upload.mapping}")private String showPath; // 映射路径@Autowiredprivate LoginInterceptor loginInterceptor;/*** interceptor配置*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor)// 添加需要验证登录用户操作权限的请求.addPathPatterns("/**")// 排除不需要验证登录用户操作权限的请求.excludePathPatterns("/user/login/**", "/user/logout/**","/apiDemo/doGet/**","/ltcloud/user/getAllUser","/ltcloud/frequency/getFrequencyById","/empower/**");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {String a = showPath + "**";String b = "file:" + uploadPath;registry.addResourceHandler(a).addResourceLocations(b).setCacheControl(CacheControl.maxAge(2, TimeUnit.DAYS));registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}

前端:

<template><div><i-frame v-if="!loading" :src="url" /></div>
</template>
<script>
import iFrame from "@/components/iFrame/index";
import { getConfigKey } from "@/api/infra/config";
export default {name: "InfraSwagger",components: { iFrame },data() {return {url: process.env.VUE_APP_BASE_API + "doc.html", // Knife4j UIloading: true};},created() {this.url =process.env.VUE_APP_BASE_API + "doc.html"this.loading = false;}
};
</script>

到此配置完毕,范围localhost:后端端口/doc.html

注:

1.BaseSwaggerAutoConfiguration类中的buildGroupedOpenApi方法可以控制显示哪些controller里的接口:

public static GroupedOpenApi buildGroupedOpenApi(String group, String path) {return GroupedOpenApi.builder().group(group).pathsToMatch("/admin-api/" + path + "/**", "/" + path + "/**").addOperationCustomizer((operation, handlerMethod) -> operation.addParametersItem(buildTenantHeaderParameter()).addParametersItem(buildSecurityHeaderParameter())).build();}

2.在controller上面加tag注解可以给controller接口起名字,改变英文显示

operation则会改变接口的名字

相关文章:

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…...

Java Fork/Join框架:三大核心组件深度解析

ForkJoinTask、ForkJoinWorkerThread 和 ForkJoinPool 构成了 Java 中 Fork/Join 框架的三个核心组件&#xff0c;它们之间形成了紧密的协作关系&#xff0c;共同提供了高效的并行计算能力。 三者关系概述 ForkJoinPool&#xff1a;执行环境&#xff0c;管理工作线程和任务调…...

【envoy】-1.安装与下载源码

1.安装 建议使用ubuntu2004&#xff0c;对glibc有要求。上个ti子更快。 wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg $ echo "deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/envo…...

B站的视频怎么下载下来——Best Video下载器

B站&#xff08;哔哩哔哩&#xff09;作为国内最受欢迎的视频平台之一&#xff0c;聚集了无数优质内容&#xff1a;动漫番剧、游戏实况、学习课程、纪录片、Vlog、鬼畜剪辑……总有那么些视频让人想反复观看、离线观看&#xff0c;甚至剪辑创作。 但你是否遇到过这样的烦恼&am…...

Mysql-定时删除数据库中的验证码

Moudle 1 使用调度器定时删除事件 数据库实现验证码自动删除的解决方案 -- 删除旧事件&#xff08;如果存在&#xff09; DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件&#xff08;每分钟执行一次&#xff09; CREATE EVENT delete_expired_captchas ON SCHE…...

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…...

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…...

MySQL连接报SSL错误

问题&#xff08;cmd&#xff09; C:\Users>mysql -h xx.xx.xx.xx -u root -p Enter password: ERROR 2026 (HY000): SSL connection error: error:0A000102:SSL routines::unsupported protocol 解决方案 1. 临时禁用 SSL 连接&#xff08;不推荐生产环境使用&#xff0…...

在WPF项目中集成Python:Python.NET深度实战指南

随着Python在数据分析、机器学习、自动化等领域的广泛应用&#xff0c;越来越多的.NET开发者希望在WPF桌面应用中调用Python代码&#xff0c;实现两者优势互补。Python.NET&#xff08;pythonnet&#xff09;作为连接.NET与Python的桥梁&#xff0c;提供了强大的跨语言调用能力…...

Nuxt.js 布局系统详解:构建可复用页面框架

Nuxt.js 是一个基于 Vue.js 的强大框架&#xff0c;旨在简化开发流程并提高项目的可维护性。布局系统是 Nuxt.js 项目结构中的一个重要组成部分&#xff0c;它位于 layouts 目录下&#xff0c;帮助开发者实现页面间的统一风格和结构复用。 什么是 Nuxt.js 布局系统 Nuxt.js 提…...

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...

[GitHub] 优秀开源项目

1 工具类 1.1 桌面猫咪互动 BongoCat...

Linux中su与sudo命令的区别:权限管理的关键差异解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)

低层协议&#xff08;Low Level Protocol, LLP&#xff09;详细解析 1. 低层协议&#xff08;Low Level Protocol, LLP&#xff09;核心特性 包基础 &#xff1a;基于字节的包协议&#xff0c;支持 短包 &#xff08;32位&#xff09;和 长包 &#xff08;可变长度&#xff0…...

第4天:RNN应用(心脏病预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…...

Python训练day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 展平操作&#xff1a;除第一个维度batchsize外全部展平 dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练…...

湖北理元理律师事务所:债务优化中的民生保障实践

在债务纠纷数量年增21%&#xff08;2023年最高人民法院数据&#xff09;的背景下&#xff0c;法律服务机构如何平衡债务清偿与民生保障&#xff0c;成为行业重要课题。湖北理元理律师事务所通过“法律金融心理”三维服务模式&#xff0c;探索出一条可持续的债务化解路径。 一、…...

Vue-Todo-list 案例

一、前言 在前端开发中&#xff0c;Todo List&#xff08;待办事项列表&#xff09; 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点&#xff0c;非常适合用来练习 Vue 的基本用法。 本文将带你一步步实现一个功能完整的 Vue Todo…...

GIC700概述

GIC-700是用于处理外设与处理器核之间&#xff0c;以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构&#xff0c;其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境&#xff0…...

动静态库的使用(Linux)

1.库 通俗来说&#xff0c;库就是现有的&#xff0c;可复用的代码&#xff0c;例如&#xff1a;在C/C语言编译时&#xff0c;就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析

你可能会认为&#xff1a;用了跨平台框架&#xff08;如 Flutter 或 React Native&#xff09;&#xff0c;开发效率提高了&#xff0c;发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时&#xff0c;现实给了我一巴掌&#xff1a; “没有 Mac&…...

统信桌面专业版如何使用python开发平台jupyter

哈喽呀&#xff0c;小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序&#xff0c;Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台&#xff0c;但是存在版权问题&#xff0c;有没有其他工具可以替代Anaconda呢…...

移除元素-JavaScript【算法学习day.04】

题目链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一种思路 标签&#xff1a;拷贝覆盖 主要思路是遍历数组 nums&#xff0c;每次取出的数字变量为 num&#xff0c;同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时&#xff…...

Android 相对布局管理器(RelativeLayout)

俩重要属性 android:gravity android:ignoreGravity Android 相对布局管理器&#xff1a;自由排列的魔法布局 想象一下&#xff0c;你是一个室内设计师&#xff0c;需要在一个房间里摆放家具。RelativeLayout&#xff08;相对布局&#xff09;就像是一个 "自由摆放"…...

DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎

DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP)&#xff0c;它为本地数据分析和处理带来了前所未有的便捷与高效 &#x1f680;。它无需外部服务器&#xff0c;可以直接在应用程序进程中运行&#xff0c;并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...

什么是预训练?深入解读大模型AI的“高考集训”

1. 预训练的通俗理解&#xff1a;AI的“高考集训” 我们可以将预训练&#xff08;Pre-training&#xff09; 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样&#xff0c;大模型在正式诞生前&#xff0c;也要经历一场声势浩大的“题海战术”…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…...

OPENCV的AT函数

一.AT函数介绍 在 OpenCV 中&#xff0c;at&#xff08;&#xff09; 是一个模板成员函数&#xff0c;用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值&#xff0c;但需要注意其性能和类型匹配问题 AT函数是OPENCV中重要的函数…...

【走好求职第一步】求职OMG——见面课测验4

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01;博主码字不易点个关注吧~~ 1.单选题(2分) 下列不属于简历撰写技巧原则的是&#xff08; A &#xff09; A.具体性 B.相关性 C.匹配性 2.单选题(2分) 笔试的下一步一般是:( B &…...

ISO 17387——解读自动驾驶相关标准法规(LCDAS)

Intelligent transport systems — Lane change decision aid systems (LCDAS) — Performance requirements and test procedures(First edition: 2008-05-01) 原文链接&#xff1a;https://cdn.standards.iteh.ai/samples/43654/701fd49bde7b4d3db165444b7c6f0c53/ISO-17387…...