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();
    }
相关推荐
weixin_531651812 小时前
Python 渐进式学习指南
开发语言·windows·python
愣头不青2 小时前
543.二叉树的直径
java·算法
weixin_649555672 小时前
C语言程序设计第四版(何钦铭、颜晖)第八章指针之在数组中查找指定元素
c语言·开发语言
add45a2 小时前
C++中的原型模式
开发语言·c++·算法
代码s贝多芬的音符2 小时前
Android NV21 转 YUV 系列格式
android·开发语言·python
2401_844221322 小时前
C++类型推导(auto/decltype)
开发语言·c++·算法
2201_753877792 小时前
高性能计算中的C++优化
开发语言·c++·算法
无限进步_2 小时前
深入解析C++容器适配器:stack、queue与deque的实现与应用
linux·开发语言·c++·windows·git·github·visual studio
2501_945425152 小时前
分布式系统容错设计
开发语言·c++·算法