当前位置: 首页 > 知识库问答 >
问题:

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

施俊明
2023-03-14

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

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnApiVersionConditional.class)
public @interface ConditionalOnApiVersion {

    int[] value() default 5;

    String property();
}

一个版本的条件是,

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
  @ConditionalOnApiVersion(value = {6, 7}, property = "userInputVersion")

也有单版本匹配的bean,喜欢

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

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

最终列表apiVersions=属性。获取(“价值”)。stream()。collect(Collectors.toList());

问题:

如何迭代属性。获取(“值”)并与userInputVersion进行比较?

属性。get(“value”)返回一个对象列表。

我试过下面的代码,

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

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

但是在第二行anyMatch中得到下面的错误,

JAVAlang.ClassCastException:[我不能转换为java.lang.Integer

谢啦

共有1个答案

和选
2023-03-14

您已经定义了一个很好的自定义注释,它使用Spring的@Conditional,这个过程只会在数组值中存在名为“property”的属性时创建bean。

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

  1. 值:int[](一个或多个受支持的版本)
  2. 属性:字符串(要比较的属性的名称)

当您使用元数据检索这些值时,Spring会将它们作为对象返回。将这些对象转换为您定义的类型是一个关键步骤。不需要流,因为迭代int[]数组很简单。

测试了各种形式的注释(value=5, value={6,7}等),发现下面的代码运行良好(只有在版本正确的情况下才创建条件bean)。

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。

 类似资料:
  • 英文原文:http://emberjs.com/guides/components/customizing-a-components-element/ 默认情况下,每个组件是一个<div>元素。如果使用开发工具查看渲染后的组件,将看到一个如下所示的DOM表示: 1 2 3 <div id="ember180" class="ember-view"> <h1>My Component</h1>

  • 我已经用自定义注释注释了Spring bean,但似乎Spring在创建bean后删除了我的自定义注释。 第二步不行,我的自定义注释丢失了。(可能是到期的代理文件) 我的豆子 我的一个自定义注释的示例 findAndDoStuffWithAnnotatedThings Bean中出错的内容被传递到一个类,在该类中,我的自定义注释得到验证,但我的验证程序找不到任何注释。(Util使用isAnnota

  • 我目前正在开发一个尽可能尊重六边形架构原则的应用程序。 因此,我的“域”模块(组Id: ; 工件Id:)不依赖于任何技术框架。 我的所有服务都使用自定义注释(本身是我域的一部分)进行注释: 然而,在我的“Quarkus应用”模块(groupId:< code > acme ;artifact id:< code > app-quar kus ,我需要注入我的“域”模块中定义的服务(< code>a

  • 我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。 项目结构: null 布尔马尔科 完全错误: 原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.

  • 问题内容: 我正在尝试复制没有指定元素的数组。假设我有以下数组: 我想要的是将数组复制到array2,而元素不包含整数“ 6”,因此它将包含“ {1,2,3,4,5,7,8,9}” 我只想使用循环,这是我到目前为止所拥有的,但是它不起作用 谢谢 问题答案:

  • 问题内容: 我正在从DropWizard 0.7.1迁移到0.8.1的过程中。这包括从Jersey 1.x迁移到2.x。在使用Jersey 1.18.1的实现中,我实现了(为简单起见,更改了所有类名)。此类将创建包含自定义注入批注的对象。包含传递并由读取的各种属性。最后,在该类中,我注册的新实例,如下所示。 我已经进行了一些研究,似乎无法完全围绕如何在Jersey 2.x中创建(或替换)这样的se