最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot的項(xiàng)目API版本控制方式

 更新時(shí)間:2026年05月14日 16:24:27   作者:梁云亮  
本文主要講述了如何通過自定義版本控制來實(shí)現(xiàn)接口版本的管理,主要包括自定義版本號(hào)標(biāo)記注解,重寫RequestCondition和RequestMappingHandlerMapping以實(shí)現(xiàn)自定義的URL匹配邏輯,以及配置注冊(cè)自定義的WebMvcRegistrations,最后通過測(cè)試接口頁面驗(yàn)證了效果

第一步:自定義版本號(hào)標(biāo)記注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiVersion {
    /**
     * 標(biāo)識(shí)版本號(hào),從1開始
     */
    int value() default 1;
}

第二步:重寫RequestCondition,自定義url匹配邏輯

@Data
@Slf4j
public class ApiVersionCondition implements RequestCondition<ApiVersionCondition> {
    /**
     * 接口路徑中的版本號(hào)前綴,如: api/v[1-n]/fun
     */
    private final static Pattern VERSION_PREFIX = Pattern.compile("/v(\\d+)/");
    private int apiVersion;

    ApiVersionCondition(int apiVersion) {
        this.apiVersion = apiVersion;
    }
    /**
     * 最近優(yōu)先原則,方法定義的 @ApiVersion > 類定義的 @ApiVersion
     */
    @Override
    public ApiVersionCondition combine(ApiVersionCondition other) {
        return new ApiVersionCondition(other.getApiVersion());
    }
    /**
     * 獲得符合匹配條件的ApiVersionCondition
     */
    @Override
    public ApiVersionCondition getMatchingCondition(HttpServletRequest request) {
        Matcher m = VERSION_PREFIX.matcher(request.getRequestURI());
        if (m.find()) {
            int version = Integer.valueOf(m.group(1));
            if (version >= getApiVersion()) {
                return this;
            }
        }
        return null;
    }
    /**
     * 當(dāng)出現(xiàn)多個(gè)符合匹配條件的ApiVersionCondition,優(yōu)先匹配版本號(hào)較大的
     */
    @Override
    public int compareTo(ApiVersionCondition other, HttpServletRequest request) {
        return other.getApiVersion() - getApiVersion();
    }
}

說明:

  • getMatchingCondition方法中,控制了只有版本小于等于請(qǐng)求參數(shù)中的版本的 ApiCondition 才滿足規(guī)則
  • compareTo 指定了當(dāng)有多個(gè)ApiCoondition滿足這個(gè)請(qǐng)求時(shí),選擇最大的版本

第三步:重寫RequestMappingHandlerMapping,自定義匹配的處理器

public class ApiRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
    @Override
    protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) {
        // 掃描類上的 @ApiVersion
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
        return createRequestCondition(apiVersion);
    }
    @Override
    protected RequestCondition<?> getCustomMethodCondition(Method method) {
        // 掃描方法上的 @ApiVersion
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        return createRequestCondition(apiVersion);
    }
    private RequestCondition<ApiVersionCondition> createRequestCondition(ApiVersion apiVersion) {
        if (Objects.isNull(apiVersion)) {
            return null;
        }
        int value = apiVersion.value();
        Assert.isTrue(value >= 1, "Api Version Must be greater than or equal to 1");
        return new ApiVersionCondition(value);
    }
}

第四步:配置注冊(cè)自定義WebMvcRegistrations

@Configuration
public class WebMvcRegistrationsConfig implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new ApiRequestMappingHandlerMapping();
    }
}

第五步:編寫測(cè)試接口

@RestController
@RequestMapping("/api/{version}")
public class ApiControler {
    @GetMapping("/fun")
    public String fun1() {
        return "fun 1";
    }
    @ApiVersion(5)
    @GetMapping("/fun")
    public String fun2() {
        return "fun 2";
    }
    @ApiVersion(9)
    @GetMapping("/fun")
    public String fun3() {
        return "fun 5";
    }
}

頁面測(cè)試效果:

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評(píng)論

垣曲县| 台州市| 盈江县| 南开区| 襄城县| 潜江市| 新竹市| 大石桥市| 凤翔县| 临安市| 香格里拉县| 红河县| 新闻| 疏附县| 平谷区| 吉木萨尔县| 托克托县| 铁岭市| 阿拉善盟| 阜城县| 成安县| 新乐市| 安龙县| 淄博市| 徐州市| 镇坪县| 宁南县| 安徽省| 广南县| 尉氏县| 新绛县| 平武县| 公主岭市| 花莲县| 永平县| 泗阳县| 永善县| 乌拉特前旗| 阿勒泰市| 青田县| 贵州省|