Springboot 3整合Knife4j(Swagger3、OpenApi3)

文章目录

前言

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版本兼容推荐:

Spring Boot版本

Knife4j Swagger 2规范

Knife4j OpenAPI 3规范

1.5.x ~ 2.0.0

< Knife4j 2.0.0

>= Knife4j 4.0.0

2.0 ~ 2.2

Knife4j 2.0.0 ~ 2.0.6

>= Knife4j 4.0.0

2.2.x ~ 2.4.0

Knife4j 2.0.6 ~ 2.0.9

>= Knife4j 4.0.0

2.4.0 ~ 2.7.x

>= Knife4j 4.0.0

>= Knife4j 4.0.0

>= 3.0

>= Knife4j 4.0.0

>= Knife4j 4.0.0

参考文档关于Knife4j适配不同Spring Boot版本的说明文档

项目配置:

JDK:22

SpringBoot:3.3.1

Knife4j:4.5.0

温馨提示:

在这里插入图片描述


二、OpenApi 3注解的使用规范

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

Swagger 2

OpenAPI 3

注解位置

作用

@Api

@Tag(name = “接口类名”,description = “接口类描述”)

Controller类

描述此controller的信息

@ApiOperation(value = “接口方法描述”)

@Operation(summary =“接口方法描述”)

Api端口方法

描述此Api的信息

@ApiImplicitParams

@Parameters

Api端口方法

描述参数信息

@ApiImplicitParam

@Parameter(description=“参数描述”)

Api方法的参数

描述参数信息

@ApiParam

@Parameter(description=“参数描述”)

Api方法的参数

-

@ApiIgnore

@Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden

-

用在各种地方,用于隐藏其Api

@ApiModel

@Schema

DTO类

用于Entity,以及Entity的属性上

@ApiModelProperty

@Schema

DTO属性

用于Entity,以及Entity的属性上

参考链接: 从 Springfox Swagger 2 迁移到 Springdoc Open API


三、使用步骤

1.Spring Boot 3.0中使用knife4j

  • 在pom.xml文件中导入knife4j的依赖(本文springboot的版本是3.3.1)

    com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.5.0

其实现在就可以使用Knife4j了,暂不做其他配置,启动项目,浏览器输入http://localhost:8080/doc.html查看接口文档

  • 由于我们没有进行任何的属性配置,所以看到的页面是knife4j的初始页面

在这里插入图片描述

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

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    #自定义swagger前端请求路径,输入http:localhost:8080/swagger-ui.html会自动重定向到swagger页面
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs    #swagger后端请求地址
    enabled: true   #是否开启文档功能
  group-configs:
    - group: 'default'   #分组名称
      paths-to-match: '/**'   #配置需要匹配的路径,默认为/**
      packages-to-scan: com.blog.patrick    #配置要扫描包的路径,一般配置到启动类所在的包名

# knife4j的增强配置,不需要增强可以不配(建议配置一下)
knife4j:
  enable: true    #开启knife4j,无需添加@EnableKnife4j注解
  setting:
    language: zh_cn   #中文
    swagger-model-name: 实体类列表   #重命名SwaggerModel名称,默认
  #开启Swagger的Basic认证功能,默认是false
  basic:
    enable: true
    # Basic认证用户名
    username: ******
    # Basic认证密码
    password: ******

3.创建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;

    /**

    • 配置类,注册web层相关组件

    • @author Patrick

    • @since 2024-07-02
      */
      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {

      /**

      • 设置静态资源映射
      • @param registry
        */
        @Override
        public 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/”);
        }
        }

4.在config包下新建Knife4jConfig.java文件

  • 该文件主要进行Knife4j的属性配置,如:作者、版本、接口分组等

    package com.blog.patrick.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.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    /**

    • Knife4j整合Swagger3 Api接口文档

    • @author Patrick

    • @since 2024-07-02
      */
      @Configuration
      public class Knife4jConfig {

      @Bean
      public GroupedOpenApi adminApi() { // 创建了一个api接口的分组
      return GroupedOpenApi.builder()
      .group(“admin-api”) // 分组名称
      .pathsToMatch(“/**”) // 接口请求路径规则
      .build();
      }

      @Bean
      public OpenAPI openAPI(){
      return new OpenAPI()
      .info(new Info() // 基本信息配置
      .title(“Knife4j整合Swagger3 Api接口文档”) // 标题
      .description(“Knife4j后端接口服务…”) // 描述Api接口文档的基本信息
      .version(“v1.0.0”) // 版本
      // 设置OpenAPI文档的联系信息,包括联系人姓名为"patrick",邮箱为"patrick@gmail.com"。
      .contact(new Contact().name(“patrick”).email(“patrick@gmail.com”))
      // 设置OpenAPI文档的许可证信息,包括许可证名称为"Apache 2.0",许可证URL为"http://springdoc.org"。
      .license(new License().name(“Apache 2.0”).url(“http://springdoc.org”))
      );
      }
      }

5.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;

}

6.controller控制层

@Tag(name = “ ”): 标记接口类别
@Operation(summary =“ ”): 标记接口操作

  • 创建(create) – 使用Post方法;

  • 修改(update) – 使用Post方法;

  • 删除(delete) – 使用Delete方法;

    @RestController
    @Tag(name = “用户列表”)
    @RequestMapping(“/user”)
    public class UserController {

    @Autowired
    UserService userService;
    
    /**
     * 用户列表
     * @return
     */
    @Operation(summary = "用户列表")
    @GetMapping("/list")
    public JsonResult list() {
        List<User> userList = userService.findAll();
        return JsonResult.success().data("userList", userList);
    }
    

    }


四、重启项目并访问接口文档

在这里插入图片描述


五、Springboot启动类优化

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

    @Slf4j
    @SpringBootApplication
    public class BlogApplication {

    public static void main(String[] args) {
        ConfigurableEnvironment env = SpringApplication.run(BlogApplication.class, args).getEnvironment();
    
        log.info("
    

    " +
                        "Application: '{}' is running Success! 
    " +
                        "Local URL: 	http://localhost:{}
    " +
                        "Document:	http://localhost:{}/doc.html
    

    " +
    “----------------------------------------------------------”,
    env.getProperty(“spring.application.name”),
    env.getProperty(“server.port”),
    env.getProperty(“server.port”));
    }

    }

  • 项目启动,控制台打印日志如下:

在这里插入图片描述

### Spring Boot 3+ Knife4j 起步依赖配置及使用方法 #### 一、引入依赖 对于Spring Boot 3及以上版本,为了成功整合Knife4j并生成API文档,需在`pom.xml`文件中加入特定的Maven依赖。考虑到Swagger2不再支持Spring Boot 3,应选用基于OpenAPI 3标准的组件——即knife4j-openapi3。 ```xml <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- 如果需要更全面的功能 --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.14</version> </dependency> ``` 上述代码展示了如何向项目添加必要的库以启用Knife4j功能[^3]。 #### 二、编写配置类 创建一个新的Java类用于定义Bean实例和其他设置项,以便更好地控制API文档的行为特性。此类通常命名为类似于`SwaggerConfig.java`: ```java import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; @Configuration @EnableKnife4j public class SwaggerConfig { @Bean(value = "defaultApi2") public Docket defaultApi2() { return new Docket(DocumentationType.OAS_30) .apiInfo(new ApiInfoBuilder() .title("Your Project API Documentation") // 文档标题 .description("This is a demo project for spring boot and knife4j.") // 描述 .contact(new Contact("Author Name", "", "")) .version("1.0") .build()) .select() .apis(RequestHandlerSelectors.basePackage("your.controller.package")) .paths(PathSelectors.any()) .build(); } } ``` 此部分代码实现了对API信息的基本描述以及路径的选择规则设定[^1]。 #### 三、访问API文档界面 完成以上两步操作之后,在应用程序运行状态下打开浏览器,并输入如下URL即可查看由Knife4j渲染后的交互式API文档页面: - `http://localhost:8080/doc.html` 该链接指向了一个集成了多种特性的在线编辑器环境,允许开发者轻松浏览已发布的RESTful服务端点及其参数详情[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值