use*_*872 5 java spring java-8
我有一个自定义注释如下.
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnApiVersionConditional.class)
public @interface ConditionalOnApiVersion {
    int[] value() default 5;
    String property();
}
OnApiVersionConditional是,
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");
    }
在我的Bean注释中,
  @Bean
  @ConditionalOnApiVersion(value = {6, 7}, property = "userInputVersion")
还有像单一版本匹配的bean
@Bean
@ConditionalOnApiVersion(value = 8, property = "userInputVersion")
我想验证属性文件中的userInput版本到可用的Beans支持版本.不确定,如何获取值,迭代并与userInoutVersion进行比较.该值可以是8或{6,7}作为int数组.不确定,如何迭代该值以检查是否有任何值与输入版本匹配.
final List apiVersions = attributes.get("value").stream().collect(Collectors.toList());
题:
如何迭代attributes.get("value")并与userInputVersion进行比较?
attributes.get("value")返回一个Object列表.
我试过下面的代码,
final List<Object> apiVersions = attributes.get("value").stream().collect(Collectors.toList());
boolean result = apiVersions.stream().anyMatch(version -> (int)version == Integer.parseInt(userInputVersion));
但得到以下错误在第二行anyMatch,
java.lang.ClassCastException:[我无法转换为java.lang.Integer
谢谢
您已经定义了一个很好的自定义注释,它使用 Spring 的 @Conditional,并且只有在数组value中存在名为“ property ”的属性时,此过程才会创建 bean 。
该注释定义了这两个变量,如下所示:
当您使用元数据检索这些值时,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。
| 归档时间: | 
 | 
| 查看次数: | 809 次 | 
| 最近记录: |