Java带数组元素的自定义注解:版本匹配校验问题
解决API版本匹配:获取自定义注解数组值并校验
我来帮你搞定这个API版本匹配的问题,咱们一步步来拆解实现思路和代码:
1. 先明确自定义注解的结构(假设)
首先我先默认你的OnApiVersionConditional注解大概是这样定义的(如果你的属性名不是value,后面代码对应调整即可):
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface OnApiVersionConditional { // 支持的版本数组,单版本(如8)会自动转为长度为1的数组,多版本(如{6,7})直接是数组 int[] value(); }
2. 核心步骤:获取注解数组+匹配校验
不管你是在Spring环境下做条件Bean注入,还是普通反射场景,核心逻辑都是这三步:
步骤1:读取配置文件中的userInputVersion
如果是Spring环境,可以通过Environment直接读取配置;普通场景的话,用你习惯的配置读取方式(比如Properties类)拿到版本值,转成对应类型(这里假设是int)。
步骤2:提取注解中的版本数组
通过反射获取Bean上的注解实例,然后直接取出数组属性值——不管是单版本还是多版本注解,都会以数组形式返回,比如@OnApiVersionConditional(8)对应的数组是[8],@OnApiVersionConditional({6,7})对应的是[6,7]。
步骤3:遍历数组判断匹配
把用户输入的版本和数组里的每个元素对比,只要有一个元素匹配,就说明这个Bean符合版本要求。
3. 代码示例(Spring环境下的条件Bean场景)
如果是用Spring的条件注解来控制Bean是否加载,实现Condition接口的代码如下:
public class ApiVersionCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 1. 从配置文件读取用户输入的版本 Environment env = context.getEnvironment(); int userInputVersion = Integer.parseInt(env.getProperty("userInputVersion")); // 2. 获取注解中的支持版本数组 Map<String, Object> annotationAttrs = metadata.getAnnotationAttributes(OnApiVersionConditional.class.getName()); if (annotationAttrs == null) { // 没有该注解的Bean直接不匹配 return false; } int[] supportedVersions = (int[]) annotationAttrs.get("value"); // 3. 遍历数组判断是否存在匹配项 for (int version : supportedVersions) { if (version == userInputVersion) { return true; } } return false; } }
然后你的Bean可以这样定义:
// 单版本匹配的Bean @Bean @Conditional(ApiVersionCondition.class) @OnApiVersionConditional(8) public UserService userServiceV8() { return new UserServiceV8Impl(); } // 多版本匹配的Bean @Bean @Conditional(ApiVersionCondition.class) @OnApiVersionConditional({6,7}) public UserService userServiceV6V7() { return new UserServiceV6V7Impl(); }
4. 普通反射场景的代码示例
如果不是Spring环境,直接通过类对象操作:
// 假设要校验的Bean类 @OnApiVersionConditional({6,7}) public class UserServiceV6V7Impl {} // 校验逻辑 public boolean isBeanMatchVersion(Class<?> beanClass, int userInputVersion) { OnApiVersionConditional annotation = beanClass.getAnnotation(OnApiVersionConditional.class); if (annotation == null) { return false; } int[] supportedVersions = annotation.value(); for (int v : supportedVersions) { if (v == userInputVersion) { return true; } } return false; }
注意点
- 如果你的注解版本属性不是
value(比如叫versions),记得把代码里的annotationAttrs.get("value")改成annotationAttrs.get("versions") - 如果版本是字符串格式(比如"v1.0"),把数组类型改成
String[],对比时用字符串相等判断即可 - 配置文件读取时要做非空和类型校验,避免NumberFormatException这类异常
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

