带有数组元素的Java自定义注释

时间:2018-02-03 18:02:19

标签: java spring java-8

我有一个自定义注释如下。

public class OnApiVersionConditional implements Condition {

  @Override
    public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
        final MultiValueMap<String, Object> attributes = metadata.getAllAnnotationAttributes(ConditionalOnApiVersion.class.getName());

       attributes.get("value");


        final String inputVersion = context.getEnvironment().getProperty("userInputVersion");


    }

OnApiVersionConditional是,

  @Bean
  @ConditionalOnApiVersion(value = {6, 7}, property = "userInputVersion")

在我的Bean注释中,

@Bean
@ConditionalOnApiVersion(value = 8, property = "userInputVersion")

还有单一版本匹配的bean,例如

final List<Object> apiVersions = attributes.get("value").stream().collect(Collectors.toList());

boolean result = apiVersions.stream().anyMatch(version -> (int)version == Integer.parseInt(userInputVersion));

我想将属性文件中的userInput版本验证为可用的Beans支持版本。不确定,如何获取值,迭代并与userInoutVersion进行比较。该值可以是8或{6,7}作为int数组。不确定,如何迭代该值以检查是否有任何值与输入版本匹配。

final List apiVersions = attributes.get(&#34; value&#34;)。stream()。collect(Collectors.toList());

问题:

如何迭代attributes.get(&#34; value&#34;)并与userInputVersion进行比较?

attributes.get(&#34; value&#34;)返回一个Object列表。

我尝试了下面的代码,

getElementById()

但是获得以下错误直到第二行anyMatch,

  

java.lang.ClassCastException:[我无法转换为java.lang.Integer

由于

1 个答案:

答案 0 :(得分:3)

您已经定义了一个使用Spring的@Conditional的良好自定义注释,如果数组 value 中存在名为“ property ”的属性,则此过程将仅创建bean。

注释定义了这两个变量如下:

  1. value int [] (一个或多个受支持的版本)
  2. property 字符串(要比较的媒体资源的名称)
  3. 当您使用元数据检索这些值时,Spring会将它们作为对象返回。将这些对象转换为您定义它们的类型是关键步骤。不需要流,因为迭代int []数组是微不足道的。

    我测试了各种形式的注释(值= 5,值= {6,7}等)并发现以下代码运行良好(只有在版本正确的情况下才会创建@Conditional beans)。

    public class OnApiVersionConditional implements Condition {
    
    @Override
    public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
    
        final MultiValueMap<String, Object> attributes = metadata
                .getAllAnnotationAttributes(ConditionalOnApiVersion.class.getName());
    
        // 1.  Retrieve the property name from the annotation (i.e. userInputVersion)
        List<Object> propertyObject = attributes.get("property");
        // 2.  Cast it to a String
        String propertyName = (String)propertyObject.get(0);
    
        // 3.  Retrieve the value 
        List<Object> list = attributes.get("value");
        // 4.  Cast it to int[]
        int[] values = (int[])list.get(0);
    
        // 5.  Look up the actual version (based on the property name in the annotation)
        final String inputVersion = context.getEnvironment().getProperty(propertyName);
        // Assume it is an integer? 
        int version = Integer.valueOf(inputVersion).intValue();
    
        // 6.  Scan the supported version; look to match against actual version
        for (int i : values)
            if (i == version)
                return true;
    
        // The version is not supported
        return false;
    
    }
    
    }
    

    这种方法可以通过验证属性和值来改进;如果其中任何一个包含错误/空值等,则返回false。