我有一个自定义注释如下。
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
由于
答案 0 :(得分:3)
您已经定义了一个使用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。