springboot3、knife4j-openapi3配置动态接口版本管理

前言:以前用swagger的时候,可以在接口上直接用自定义注解标记版本,但是需要配置Docket,knife4j-openapi3废弃掉Docket换成GroupedOpenApi了,所以需要做一些改动。

java 复制代码
<!-- Knife4j for Spring Boot 3.x -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.5.0</version>
</dependency>
  1. 自定义注解
java 复制代码
package com.xx.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * swagger 版本注解
 *
 * @author maomo
 * @version 1.0.0
 * @date 2022/9/30
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ApiVersion {

    /**
     * 接口版本号(对应swagger中的group)
     * @return String[]
     */
    String[] group();


}

2.1 以前用swagger的时候,swaggerConfig里的写法是:

java 复制代码
    @Bean
    public Docket v100(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("v1.0.0")
                .select()
                .apis(input -> {
                    ApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(ApiVersion.class);
                    return apiVersion != null && Arrays.asList(apiVersion.group()).contains("v1.0.0");
                })//controller路径
                .paths(PathSelectors.any())
                .build();
    }

    @Bean
    public Docket v110(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("v1.1.0")
                .select()
                .apis(input -> {
                    ApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(ApiVersion.class);
                    return apiVersion != null && Arrays.asList(apiVersion.group()).contains("v1.1.0");
                })//controller路径
                .paths(PathSelectors.any())
                .build();
    }

2.2 现在springboot3+knife4j-openapi3的写法是:

java 复制代码
    @Bean
    public GroupedOpenApi V100() {
        return GroupedOpenApi.builder()
                .group("v1.0.0")
                .addOpenApiMethodFilter(method -> {
                    // 获取方法上的 @ApiVersion 注解
                    ApiVersion apiVersion = method.getAnnotation(ApiVersion.class);
                    // 判断是否包含当前版本
                    return apiVersion != null &&
                            Arrays.asList(apiVersion.group()).contains("v1.0.0");
                })
                .packagesToScan("com.wyzz.controller") // 指定扫描的包
                .build();
    }
    @Bean
    public GroupedOpenApi V110() {
        return GroupedOpenApi.builder()
                .group("v1.1.0")
                .addOpenApiMethodFilter(method -> {
                    // 获取方法上的 @ApiVersion 注解
                    ApiVersion apiVersion = method.getAnnotation(ApiVersion.class);
                    // 判断是否包含当前版本
                    return apiVersion != null &&
                            Arrays.asList(apiVersion.group()).contains("v1.1.0");
                })
                .packagesToScan("com.wyzz.controller") // 指定扫描的包
                .build();
    }
相关推荐
土豆.exe8 小时前
Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过
java·python·安全
时空系8 小时前
第7篇功能——打造你的工具箱 python中文编程
开发语言·python·ai编程
shughui8 小时前
2026最新JDK版本选择及下载安装详细图文教程【windows、mac附安装包】
java·linux·开发语言·windows·jdk·mac
Wenzar_8 小时前
# D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建在现代前端开发中,**数据可视化已成为提升用户体验的核心能力之一
java·javascript·python·信息可视化·ux
TE-茶叶蛋8 小时前
Spring自动配置分析
java·后端·spring
XiYang-DING8 小时前
【Java EE】锁策略、锁升级、锁消除和锁粗化
java·redis·java-ee
AI玫瑰助手8 小时前
Python基础:集合的定义、去重与交并差运算
开发语言·python·信息可视化
wu8587734578 小时前
Java AI Harness 落地:拥抱框架还是回归本质?深度解析选型之道
java·人工智能·回归
无敌秋8 小时前
# C++ 工厂方法模式实战指南
开发语言·c++·设计模式
北风toto8 小时前
SpringBoot 获取配置文件值、获取环境变量的方式
java·spring boot·后端