app版本控制java后端接口版本管理

java api version 版本控制 java接口版本管理

1 自定义 AppVersionHandleMapping
自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法
public class AppVersionHandleMapping extends RequestMappingHandlerMapping
{@Overrideprotected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType){AppVersion annotation = handlerType.getAnnotation(AppVersion.class);return annotation == null ? null : new AppVersionCondition(new VersionItem(annotation.value()));}@Overrideprotected RequestCondition<?> getCustomMethodCondition(Method method){AppVersion annotation = method.getAnnotation(AppVersion.class);return annotation == null ? null : new AppVersionCondition(new VersionItem(annotation.value()));}
}
2 自定义注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AppVersion
{String value() default "1.0.0";
}
3 实现RequestCondition里面的方法
@Data
public class AppVersionCondition implements RequestCondition<AppVersionCondition> {private VersionItem versionItem;public AppVersionCondition(VersionItem versionItem) {this.versionItem = versionItem;}@Overridepublic AppVersionCondition combine(AppVersionCondition other) {// 选择大版本return versionItem.compareTo(other.getVersionItem()) >= 0 ? new AppVersionCondition(this.getVersionItem()) : new AppVersionCondition(other.getVersionItem());}@Overridepublic AppVersionCondition getMatchingCondition(HttpServletRequest request) {String appVersion = RequestUtil.getAppVersion(request);VersionItem item = new VersionItem(appVersion);// 获取所有小于等于版本的接口if (item.compareTo(this.versionItem) >= 0)return this;return null;}@Overridepublic int compareTo(AppVersionCondition other, HttpServletRequest request) {// 获取最大版本对应的接口return other.getVersionItem().compareTo(this.versionItem);}
4 最后把自定义的AppVersionHandleMapping注入MVC管理
@Configuration
public class WebConfig implements WebMvcConfigurer, WebMvcRegistrations {@Overridepublic RequestMappingHandlerMapping getRequestMappingHandlerMapping() {return new AppVersionHandleMapping();}
5 版本比对工具
@Data
public class VersionItem implements Comparable<VersionItem> {private String appVersion;public VersionItem(String appVersion) {// 截取前三位String[] split = appVersion.split("\\.");if (split.length > 3)appVersion = split[0] + "." + split[1] + "." + split[2];this.appVersion = appVersion;}@Overridepublic int compareTo(@NotNull VersionItem o) {return compareVersion(o.getAppVersion());}/*** 判断版本** @param version 版本*/private int compareVersion(String version) {String[] version1 = appVersion.split("\\.");String[] version2 = version.split("\\.");int i1 = 0;int i2 = 0;int n1 = version1.length;int n2 = version2.length;for (int i = 0; i < Math.max(n1, n2); i++) {i1 = i < n1 ? Integer.parseInt(version1[i]) : 0;i2 = i < n2 ? Integer.parseInt(version2[i]) : 0;if (i1 != i2)return Integer.compare(i1, i2);}return 0;}
6 参考

https://blog.51cto.com/u_13521/9789790

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LRU 算法详解与 Java 的两种实现方式

LRU 算法详解与 Java 的两种实现方式 LRU 算法详解与 Java 的两种实现方式一、LRU 算法简介二、LRU 算法原理三、LRU 算法应用场景四、Java 实现 LRU 算法(一)基于 LinkedHashMap 实现(二)基于双向链表和 HashMap 实现五、总结LRU 算法详解与 Java 的两种实现方式 一、LRU…

基于 Python 的财经数据接口库:AKShare

AKShare 是基于 Python 的财经数据接口库&#xff0c;目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具&#xff0c;主要用于学术研究目的。 安装 安装手册见…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容&#xff0c;MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令&#xff0c;你需要找到 mysql 可执行文件的路径。 在 macOS 上&#xff0c;mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此&#xff0c;完整的路径应该是&#xff1…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

通过外部链接启动 Flutter App(详细介绍及示例)

通过外部链接启动 Flutter App&#xff08;firebase_dynamic_links 和 app_links&#xff09; 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中&#xff0c;经常有点击链接启动并进入APP的需求&#xff08;如果未安装跳转到应用商店&#xff09;。Android通…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

MySQL DCL 数据控制

文章目录 1.新建用户2.删除用户3.用户授权4.撤销用户权限5.查看用户权限6.修改用户密码7.权限类型参考文献 1.新建用户 连接到 MySQL 服务器后&#xff0c;管理员或特权用户可以使用 CREATE USER 语句创建新用户。 CREATE USER usernamehost IDENTIFIED BY password;-- 示例 …

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程&#xff0c;其中一个实例是讲如何爬取淘宝商品信息&#xff0c;现整理如下&#xff1a; 功能描述&#xff1a;获取淘宝搜索页面的信息&#xff0c;提取其中的商品名称和价格 探讨&#xff1a;淘宝的搜索接口 翻页的处理 技术路线:requests…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7&#xff1a;Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

深度学习 Pytorch 张量的索引、分片、合并以及维度调整

张量作为有序的序列&#xff0c;也是具备数值索引的功能&#xff0c;并且基本索引方法和python原生的列表、numpy中的数组基本一致。 不同的是&#xff0c;pytorch中还定义了一种采用函数来进行索引的方式。 作为pytorch中的基本数据类型&#xff0c;张量既具备了列表、数组的基…

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展&#xff0c;越来越多的卖家开始尝试使用云手机来协助他们的业务&#xff0c;这是因为云手机具有许多优势。那么&#xff0c;具体来说&#xff0c;跨境电商使用云手机可以做哪些事情呢&#xff1f; &#xff08;一&#xff09;实现多账号登录和管理 跨境电商…

一体机cell服务器更换内存步骤

一体机cell服务器更换内存步骤&#xff1a; #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…

“AI开放式目标检测系统:开启智能识别新时代

嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊一个超酷炫的技术——AI开放式目标检测系统。这可不是什么高大上、遥不可及的玩意儿&#xff0c;它已经悄悄地走进了我们的生活&#xff0c;改变着我们对世界的认知和互动方式呢。 先来说说&#xff0c;什么是AI开放式目标检测系…

【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结

问题背景 项目架构为前后端分离的微服务架构&#xff1a; 前端部署在 8000 端口API 网关部署在 9000 端口后端服务包括&#xff1a; api-backend (9001端口)api-interface (9002端口) 初始状态&#xff1a; 前端已配置 HTTPS&#xff08;端口 8000&#xff09;后端服务未配…

csp-j知识点:联合(Union)的基本概念

一、联合&#xff08;Union&#xff09;的基本概念 联合是C/C语言中一种特殊的数据结构&#xff0c;它的主要特点是所有成员共享同一块内存空间。这意味着在任何给定时刻&#xff0c;联合中只有一个成员是有效的&#xff0c;因为它们都占用相同的物理内存位置。联合的大小取决…

【游戏设计原理】68 - 玩家错误

一、错误类型 玩家错误类型 行为错误&#xff08;performance errors&#xff09;和运动控制错误&#xff08;motor control errors&#xff09;是玩家在游戏中常犯的错误。 运动控制错误 错误发生在玩家协调或掌握输入设备时&#xff0c;可能包括不小心按错键或未能及时把握战…

2.使用Spring BootSpring AI快速构建AI应用程序

Spring AI 是基于 Spring Boot3.x 框架构建&#xff0c;Spring Boot官方提供了非常便捷的工具Spring Initializr帮助开发者快速的搭建Spring Boot应用程序,IDEA也集成了此工具。本文使用的开发工具IDEASpring Boot 3.4Spring AI 1.0.0-SNAPSHOTMaven。 1.创建Spring Boot项目 …

Quantum supremacy using a programmable superconducting processor 全文翻译,配公式和图

2019年&#xff0c;谷歌的量子霸权文章&#xff0c; 原文链接&#xff1a; https://www.nature.com/articles/s41586-019-1666-5 第一稿&#xff0c;公式和视图后续再加 。。。 Quantum supremacy using a programmable superconducting processor 使用可编程超导处理器的量…