当前位置: 首页 > 面试题库 >

@ConditionalOnProperty用于列表或数组?

关玮
2023-03-14
问题内容

我正在使用Spring Boot 1.4.3 @AutoConfiguration,根据用户指定的属性自动创建bean。用户可以指定一系列服务,其中
名称版本 为必填字段:

service[0].name=myServiceA
service[0].version=1.0

service[1].name=myServiceB
service[1].version=1.2

...

如果用户忘记了甚至只在一项服务上都指定了必填字段,那么我想回退而不创建任何bean。我可以用@ConditionalOnProperty吗?我想要类似的东西:

@Configuration
@ConditionalOnProperty({"service[i].name", "service[i].version"})
class AutoConfigureServices {
....
}

问题答案:

这是Condition我创建的风俗。它需要一些修饰才能更通用(即,不对字符串进行硬编码),但对我来说效果很好。

要使用,我用以下注释了我的Configuration类
@Conditional(RequiredRepeatablePropertiesCondition.class)

public class RequiredRepeatablePropertiesCondition extends SpringBootCondition {

    private static final Logger LOGGER = LoggerFactory.getLogger(RequiredRepeatablePropertiesCondition.class.getName());

    public static final String[] REQUIRED_KEYS = {
            "my.services[i].version",
            "my.services[i].name"
    };

    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        List<String> missingProperties = new ArrayList<>();
        RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment());
        Map<String, Object> services = resolver.getSubProperties("my.services");
        if (services.size() == 0) {
            missingProperties.addAll(Arrays.asList(REQUIRED_KEYS));
            return getConditionOutcome(missingProperties);
        }
        //gather indexes to check: [0], [1], [3], etc
        Pattern p = Pattern.compile("\\[(\\d+)\\]");
        Set<String> uniqueIndexes = new HashSet<String>();
        for (String key : services.keySet()) {
            Matcher m = p.matcher(key);
            if (m.find()) {
                uniqueIndexes.add(m.group(1));
            }
        }
        //loop each index and check required props
        uniqueIndexes.forEach(index -> {
            for (String genericKey : REQUIRED_KEYS) {
                String multiServiceKey = genericKey.replace("[i]", "[" + index + "]");
                if (!resolver.containsProperty(multiServiceKey)) {
                    missingProperties.add(multiServiceKey);
                }
            }
        });
        return getConditionOutcome(missingProperties);
    }

    private ConditionOutcome getConditionOutcome(List<String> missingProperties) {
        if (missingProperties.isEmpty()) {
            return ConditionOutcome.match(ConditionMessage.forCondition(RequiredRepeatablePropertiesCondition.class.getCanonicalName())
                    .found("property", "properties")
                    .items(Arrays.asList(REQUIRED_KEYS)));
        }
        return ConditionOutcome.noMatch(
                ConditionMessage.forCondition(RequiredRepeatablePropertiesCondition.class.getCanonicalName())
            .didNotFind("property", "properties")
            .items(missingProperties)
        );
    }
}


 类似资料:
  • 我基于这个例子测试了一个小的OSX应用程序,它使用到AppleScript的桥梁从iTunes获取简单的信息。 就像我在ComboDrums的评论中说的(是我),我有一个脚本可以将我所有的iTunes播放列表放在树上,但是一旦返回比简单的字符串更复杂,它就会失败。 因此,我正在寻找一种方法,将AppleScript的列表返回到一个Swift友好对象。 有什么想法吗? 谢谢。 脚本:

  • 我有一个模型对象组 我正在使用Jackson序列化此对象。我只想序列化用户,而不是序列化列表“members”中的整个用户对象。getTitle()字段。基本上,我希望HashMap是 我已经为此编写了自定义序列化程序 但它不起作用。如何序列化仅列表字段而不是整个用户对象?

  • 我从这个URL刮取了这个表: "https://www.patriotsoftware.com/blog/accounting/average-cost-living-by-state/" 看起来像这样: 然后我编写了这个函数来帮助我将字符串转换成整数: 当我只将函数应用于一列时,它就会工作。我在这里找到了关于在多个列上使用的答案:如何将函数应用于多个列 但我下面的代码不起作用,也不会产生错误:

  • 问题内容: 我编写了一个程序来查找给定项目列表的所有可能排列。这恰恰意味着我的程序会打印出r = 0到n的所有可能的P(n,r)值 下面是代码: `` 输出量 我的问题是,随着我增加输入列表中的数字。运行时间增加,并且在输入列表中输入11个数字后,程序几乎消失了。运行大约需要2 GB内存。 我正在具有8GB RAM和i5处理器的计算机上运行此程序,因此速度和空间不是问题。 如果有人可以帮助我编写更

  • 问题内容: 我注意到最近有一段代码直接比较两个整数列表,如下所示: 这似乎有点奇怪,但我想如果所有元素都大于,它将返回,如果每个元素相等或元素大于则返回False 。所以我测试了它: 好的,行得通。和: 但是当它变得更加模糊时: 要么: 结果有点陌生。python实际在做什么?看来它返回的结果偏向于第一个列表,其中最左边的元素大于相应的元素? 问题答案: 从比较序列和其它类型在Python教程:

  • 问题内容: 我发现列表大于数字。 有什么理由可以奏效吗?我无法使用将列表转换为int 。无法使用将该int转换为列表。那么python如何比较两者呢? 问题答案: 在“不匹配”类型的情况下,这些类型按类型名称按字典顺序列出:“列表”按字母顺序在“ int”之后,因此更大。 CPython实现细节:除数字外,其他类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。(来源) 没有用