SpringBoot3中swagger无法使用

ops/2025/2/19 13:06:08/

前言

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相关资源放行,保证生成的接口文档能够正常进行展示
java">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的属性参数,如:作者、版本等
java">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的属性配置,如:作者、版本、接口分组等
java">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 = “ ”): 标记实体类属性
java">@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 =“ ”): 标记接口操作
java">@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);}}
java">@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启动类优化

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

java">@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.ppmy.cn/ops/132469.html

相关文章

基于51单片机的温控电风扇proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1vgYgY41tp_axxVFTHAPwFg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

[含文档+PPT+源码等]精品基于Python实现的django房屋出租系统的设计与实现

基于Python实现的Django房屋出租系统的设计与实现背景&#xff0c;主要源于以下几个方面&#xff1a; 一、房屋租赁市场的现状和需求 在现代社会&#xff0c;随着人口流动性的增加和城市化进程的加速&#xff0c;租房需求日益增长。传统的房屋租赁市场存在信息不对称、效率低…

设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)

前言&#xff1a; 看了很多书、学了很多知识&#xff0c;多线程能玩出花&#xff0c;可最后我还是写不好代码&#xff01; 这就有点像家里装修完了买物件&#xff0c;我几十万的实木沙发&#xff0c;怎么放这里就不好看。同样代码写的不好并不一定是基础技术不足&#xff0c;也…

VMware 虚拟机使用教程及 Kali Linux 安装指南

VMware 虚拟机使用教程及 Kali Linux 安装指南 在现代计算机科学与网络安全领域&#xff0c;虚拟化技术的应用越来越广泛。VMware 是一款功能强大的虚拟化软件&#xff0c;可以帮助用户在同一台物理机上运行多个操作系统。本文将详细介绍如何使用 VMware 虚拟机&#xff0c;并…

Sql面试题(一)求排名top10

需求&#xff1a; 1&#xff09;表名&#xff1a;t_patent_detail &#xff08;专利明细表&#xff09; 2&#xff09;表字段&#xff1a;专利号(patent_id)、专利名称(patent_name)、专利类型(patent_type)、申请时间 (aplly_date)、授权时间(authorize_date)、申请人(appl…

Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求

1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包&#xff0c;使用8080端口 程序正常启动 3、使用 postman 发送请求&#xff0c;失败 4、检查端口是否开放&#xff08;需更换到 root 用户&#xff09; firewall-cmd --zonepublic --query-por…

QT中 update()函数无法实时调用 paintEvent

QT中 update()函数无法实时调用 paintEvent&#xff01; 在QT中&#xff0c;update()函数用于标记一个窗口区域为“需要重绘”。当调用update()后&#xff0c;QT会在合适的时候调用paintEvent()来重绘这个区域。然而&#xff0c;update()不会立即调用paintEvent()&#xff0c;…

C# NUnit 框架:高效使用指南

一、NUnit 简介 NUnit 是一个专门为.NET 语言设计的开源单元测试框架&#xff0c;它基于 xUnit 架构&#xff0c;提供了丰富的断言方法和测试运行机制&#xff0c;帮助开发者轻松地编写和执行单元测试用例。使用 NUnit&#xff0c;我们可以对代码中的各个功能单元进行独立测试&…