SpringBoot3中swagger无法使用

前言

springboot 3开始javax包改成了jakarta,而swagger-oas等包中依然使用的是javax,所以报错。另外springfox已经停止更新有段时间了,并且不支持OpenAPI 3标准,升级Springboot 3.0以后会有更多问题暴露出来。而SpringBoot 3只支持OpenAPI 3规范,因此Spring官网推荐了Springdoc

 
OpenApi 3的规范,目前针对Java的Spring Boot项目,主要支持的有2个版本:

  • springfox 3.0.0: 同时兼容OpenAPI 2以及OpenAPI 3,但是停更很久了
  • springdoc-openapi:兼容OpenAPI 3规范,更新速度频繁
  • Knife4j:在只有的OpenAPI 3规范中,底层基础框架选择springdoc-openapi项目,针对Springfox 3.0.0版本会放弃
     

一、Spring Boot 3.0整合Knife4j

以下是一些常见的Spring Boot版本及其对应的Knife4j版本兼容推荐:

image.png

参考文档:Knife4j文档
 

二、OpenApi 3注解的使用规范

Swagger 3(OpenApi 3) 注解与Swagger 2注解的对比

Swagger 2OpenAPI 3注解位置作用
@Api@Tag(name = “接口类名”,description = “接口类描述”)Controller类描述此controller的信息
@ApiOperation(value = “接口方法描述”)@Operation(summary =“接口方法描述”)Api端口方法描述此Api的信息
@ApiImplicitParams@ParametersApi端口方法描述参数信息
@ApiImplicitParam@Parameter(description=“参数描述”)Api方法的参数描述参数信息
@ApiParam@Parameter(description=“参数描述”)Api方法的参数-
@ApiIgnore@Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden-用在各种地方,用于隐藏其Api
@ApiModel@SchemaDTO类用于Entity,以及Entity的属性上
@ApiModelProperty@SchemaDTO属性用于Entity,以及Entity的属性上
@ApiResponse(code = 404, message = “foo”)@ApiResponse(responseCode = “404”, description = “foo”)Api方法上描述响应数据

参考链接

 

三、使用步骤

  1. Spring Boot 3.0中使用knife4j
    在pom.xml文件中导入knife4j的依赖(本文springboot的版本是3.3.1)
<!-- Swagger3-knife4j依赖 -->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</version>
</dependency>

其实现在就可以使用Knife4j了,暂不做其他配置,启动项目,浏览器输入http://localhost:端口号/doc.html查看接口文档
由于我们没有进行任何的属性配置,所以看到的页面是knife4j的初始页面
image.png

  1. 在application.yml中添加knife4j相关配置

# springdoc-openapi项目配置
springdoc:swagger-ui:#自定义swagger前端请求路径,输入http:localhost:8080/swagger-ui.html会自动重定向到swagger页面path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaapi-docs:path: /v3/api-docs    #swagger后端请求地址enabled: true   #是否开启文档功能group-configs:- group: 'default'   #分组名称paths-to-match: '/**'   #配置需要匹配的路径,默认为/**packages-to-scan: com.shkj.test    #配置要扫描包的路径,一般配置到启动类所在的包名
#packages-to-scan一定要记得修改-------------------------------------------------------------------# knife4j的增强配置,不需要增强可以不配(建议配置一下)
knife4j:enable: true    #开启knife4j,无需添加@EnableKnife4j注解setting:language: zh_cn   #中文swagger-model-name: 实体类列表   #重命名SwaggerModel名称,默认#开启Swagger的Basic认证功能,默认是falsebasic:enable: true# Basic认证用户名username: ***# Basic认证密码password: ***swagger3: name: 盛海团队email: ***title: xxxdescription: xxxversion: 1.0termsOfServiceUrl: xxx
  1. 创建config包,在其中新建一个配置类
    定义配置类WebMvcConfig,实现静态资源映射,将knife4j相关资源放行,保证生成的接口文档能够正常进行展示
package com.blog.patrick.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** <p>* 配置类,注册web层相关组件* </p>** @author Patrick* @since 2024-07-02*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {/*** 设置静态资源映射* @param registry */@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 添加静态资源映射规则registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");//配置 knife4j 的静态资源请求映射地址registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}
  1. 在config包下新建SwaggerProperties.java文件
    该文件主要读取swagger的属性参数,如:作者、版本等
package com.shkj.test.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;@Data
@ConfigurationProperties(prefix = "swagger3")
public class SwaggerProperties {/*** 联系人的名称*/private String name;/*** 联系人的邮箱*/private String email;/*** API的标题*/private String title;/*** API的描述*/private String description;/*** API的版本号*/private String version;/*** API的服务团队*/private String termsOfServiceUrl;
}
  1. 在config包下新建Knife4jConfig.java文件
    该文件主要进行Knife4j的属性配置,如:作者、版本、接口分组等
package com.shkj.test.config;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.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Knife4j整合Swagger3 Api接口文档*/
@Configuration
@EnableConfigurationProperties(SwaggerProperties.class)
public class Knife4jConfig {private SwaggerProperties swaggerProperties;public Knife4jConfig(SwaggerProperties swaggerProperties) {this.swaggerProperties = swaggerProperties;}@Beanpublic GroupedOpenApi adminApi() { // 创建了一个api接口的分组return GroupedOpenApi.builder().group("admin-api") // 分组名称.pathsToMatch("/**") // 接口请求路径规则.build();}@Beanpublic OpenAPI openAPI(){return new OpenAPI().info(new Info() // 基本信息配置.title(swaggerProperties.getTitle()) // 标题.description(swaggerProperties.getDescription()) // 描述Api接口文档的基本信息.version(swaggerProperties.getVersion()) // 版本.termsOfService(swaggerProperties.getTermsOfServiceUrl())// 设置OpenAPI文档的联系信息,包括联系人姓名为"patrick",邮箱为"patrick@gmail.com"。.contact(new Contact().name(swaggerProperties.getName()).email(swaggerProperties.getEmail()))// 设置OpenAPI文档的许可证信息,包括许可证名称为"Apache 2.0",许可证URL为"http://springdoc.org"。.license(new License().name("Apache 2.0").url("\"http://springdoc.org\"")));}
}
  1. entity实体类
    @Schema(description = “ ”): 标记实体类属性
@Data
@TableName("t_user")
@Schema(description = "用户实体")
public class User implements Serializable {@Schema(description = "用户id")private Integer id;@Schema(description = "用户昵称")private String nickname;@Schema(description = "用户名")private String username;@Schema(description = "用户密码")private String password;}
  1. controller控制层
    @Tag(name = “ ”): 标记接口类别
    @Operation(summary =“ ”): 标记接口操作
@RestController
@Tag(name = "用户列表")
@RequestMapping("/user")
public class UserController {@AutowiredUserService userService;/*** 用户列表* @return*/@Operation(summary = "用户列表")@GetMapping("/list")public JsonResult list() {List<User> userList = userService.findAll();return JsonResult.success().data("userList", userList);}}
@RestController
@RequestMapping("body")
@Tag(name = "body参数")
public class BodyController {@Operation(summary = "普通body请求")@PostMapping("/body")public ResponseEntity<FileResp> body(@RequestBody FileResp fileResp){return ResponseEntity.ok(fileResp);}@Operation(summary = "普通body请求+Param+Header+Path")@Parameters({@Parameter(name = "id",description = "文件id",in = ParameterIn.PATH),@Parameter(name = "token",description = "请求token",required = true,in = ParameterIn.HEADER),@Parameter(name = "name",description = "文件名称",required = true,in=ParameterIn.QUERY)})@PostMapping("/bodyParamHeaderPath/{id}")public ResponseEntity<FileResp> bodyParamHeaderPath(@PathVariable("id") String id,@RequestHeader("token") String token, @RequestParam("name")String name,@RequestBody FileResp fileResp){fileResp.setName(fileResp.getName()+",receiveName:"+name+",token:"+token+",pathID:"+id);return ResponseEntity.ok(fileResp);}
}

8.重启项目并访问接口文档
访问http://localhost:端口号/doc.html,可以看到我们配置的属性已经在页面中显示出来了
image.png

image.png

 

四、Springboot启动类优化

每次都需要打开浏览器输入地址访问,对开发者很不友好,因此采取以下优化

@Slf4j
@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {ConfigurableEnvironment env = SpringApplication.run(BlogApplication.class, args).getEnvironment();log.info("\n----------------------------------------------------------\n\t" +"Application: '{}' is running Success! \n\t" +"Local URL: \thttp://localhost:{}\n\t" +"Document:\thttp://localhost:{}/doc.html\n" +"----------------------------------------------------------",env.getProperty("spring.application.name"),env.getProperty("server.port"),env.getProperty("server.port"));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker安装zlmediakit服务(zlm)

zlmediakit安装 zlmediakit安装需要依赖环境和系统配置&#xff0c;所以采用docker的方式来安装不容易出错。 docker pull拉取镜像(最新) docker pull zlmediakit/zlmediakit:master然后先运行起来 sudo docker run -d -p 1935:1935 -p 80:80 -p 8554:554 -p 10000:10000 -p …

第九周预习报告

文章目录 密码系统设计第九周预习报告学习内容AI 对学习内容的总结&#xff08;1分&#xff09;要求总结 对 AI 总结的反思与补充&#xff08;2分&#xff09;反思与补充 补充内容反思学习思维导图&#xff08;2分&#xff09;要求思维导图代码导图 基于 AI 的学习&#xff08;…

GB/T 43206—2023信息安全技术信息系统密码应用测评要求(五)

文章目录 附录AA.1 概述A.2 密钥产生A.3 密钥分发A.4 密钥存储A.5 密钥使用A.6 密钥更新A.7 密钥归档A. 8 密钥撤销A.9 密钥备份A.10 密钥恢复A.11 密钥销毁 附录B附录C 附录A A.1 概述 密钥管理对于保证密钥全生存周期的安全性至关重要 ,可以保证密钥(除公开密钥外) 不被非授…

phpstudy 使用php8.2.9版本报错问题

phpstudy 使用php8.2.9版本报错问题 1、如果php8的扩展控制面板开启无效的话&#xff0c;可以手动开启试试 2、php有报错日志&#xff1a; Fatal error: Directive ‘track_errors’ is no longer available in PHP in Unknown on line 0 在切换php版本到更高版本时在终端查…

【科普小白】LLM大语言模型的基本原理

一、要了解LLM大模型的基本原理就要先来了解一下自然语言处理&#xff08;NLP&#xff09;。 NLP 是 AI 的一个子领域&#xff0c;专注于使计算机能够处理、解释和生成人类语言&#xff0c;主要任务包括&#xff1a;文本分类、自动翻译、问题回答、生成文本等。到底是NLP促生了…

初识网络编程TCP/IP

目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程&#xff0c;会出现一堆协议、概念、这层次那技术的&#xff0c;头都大了&#xff0c;还是得总结总结…… 相关名词解释 ✨✨网络…

整合本地市场机会 同城小程序打造社区商圈

同城市场中&#xff0c;商家与消费者之间的互动和交易模式正在发生深刻变化&#xff0c;同城小程序成为了企业、商户和消费者之间连接的桥梁&#xff0c;成为打造社区商圈、整合本地市场机会的重要工具。今天小编分享&#xff0c;同城小程序怎么一个软件整合以前十几个APP做的事…

安当ASP系统:适合中小企业的轻量级Radius认证服务器

安当ASP&#xff08;Authentication Service Platform&#xff09;身份认证系统是一款功能强大的身份认证服务平台&#xff0c;特别适用于中小企业。其中&#xff0c;简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、主要…

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 &#xff08;1&#xff09;安装 Keil5 MDK 文件路径&#xff1a;江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE&#xff0c;安装即可&#xff0c;路径不能有中文。 &#xff08;2&#xff09;安装器件支持包 文件路径&#xff1a;江科大stm32入门教程资料…

面试经典 150 题:121,125

121. 买卖股票的最佳时机 【参考代码】 动态规划解决 class Solution { public:int maxProfit(vector<int>& prices) {int size prices.size();int min_price 99999, max_profit 0;for(int i0; i<size; i){if(prices[i] < min_price){min_price prices[i…

Spring boot 读模块项目升级为spring cloud 项目步骤以及问题

1.结构说明 bean 模块 &#xff0c;public 模块&#xff0c; client 模块&#xff0c; erp模块&#xff0c;system 主模块。 2.环境说明以及pom 原本环境 新环境 mysql 5.7 -------------- mysql 8.0 maven 3.9.6 jdk 8 -----------…

Linux系统-初始化

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后&#xff0c;我们Linux进阶部分讲完以后&#xff0c;我们的Linux操作部分就…

element-plus的Tree 树形控件添加图标

该文章为本菜鸡学习记录&#xff0c;如有错误还请大佬指教 本人刚开始接触vue框架&#xff0c;在使用element-plus组件想实现树形控件&#xff0c;发现官网的组件示例没有图标区分显示 实现效果 代码 <temple 部分 <el-tree :data"data" node-click"hand…

【详细 工程向】基于Smart3D的五镜头相机三维重建

数据部分&#xff1a; 数据要求 &#xff08;1&#xff09;每条行带至少从 3 个不同的视角进行拍摄。 &#xff08;2&#xff09;相邻相片之间的重叠度通常要求大于三分之二。 &#xff08;3&#xff09;不同拍摄视角之间夹角应该少于 15 度。 &#xff08;4&#xff09;通…

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到&#xff1a;需要将某份pdf中的表格数据提取出来&#xff0c;以便能够“修改使用”数据 可将pdf中的表格提取出来&#xff0c;解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候&#xff0c;提取数据到excel不太容易 比…

mean_x2 = (x**2).mean(dim=dims, keepdims=True)

这行代码的作用是计算输入张量 x 在指定维度上的平方均值&#xff0c;并保持原始维度的形状。具体来说&#xff1a; mean_x2 (x**2).mean(dimdims, keepdimsTrue) # [b,1,1] 参数解释 x**2&#xff1a;对输入张量 x 的每个元素进行平方运算。.mean(dimdims, keepdimsTrue)…

Enscape 4.2 安装教程(支持资源库)

软件介绍 Enscape 是专门为建筑、规划、景观及室内设计师打造的渲染产品&#xff0c;无需导入导出文件&#xff0c;在常用的软件内部即可看到逼真的渲染效果。 你无需了解记忆各种参数的用法&#xff0c;一切都是傻瓜式的一键渲染&#xff0c;你可以把精力更多地投入到设计中…

DBeaver工具连接Hive

DBeaver工具连接Hive 首先解压安装包dbeaver-ce-latest-x86_64-setup.zip,并安装dbeaver-ce-latest-x86_64-setup.exe; 安装Kerberos客户端4.1-amd64.msi; 查看集群节点/etc/hosts文件内容,并追加到C:\Windows\System32\drivers\etc\hosts; 下载集群用户keytab文件,并解压…

4.4 软件设计:UML顺序图

UML顺序图 1、 UML2、 UML顺序图2.1 顺序图组成对象生命线消息 2.2 顺序图和用例登录用例 2.3 顺序图建模顺序图建模参考策略建立顺序图的步骤建立顺序图的示例 3、面对对象的设计原则3.1 特点3.2 层次3.3 注意点类设计需要强内聚&#xff0c;弱耦合可重用性框架 1、 UML 统一…

云计算:定义、类型及对企业的影响

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企…