gpt4 book ai didi

java - 使用 Spring 表达式语言断言从属性文件加载的属性(具有逗号分隔值)是否包含 "value"

转载 作者:行者123 更新时间:2023-12-01 17:34:24 25 4
gpt4 key购买 nike

我有以下问题,我在 Spring Boot 中有一个包含 beans 的配置类,只有当具有值列表的某个属性包含特定值时,我才想创建它。

现在配置类看起来像这样:

@ConditionalOnExpression("#{'${conditions.values.options}'.contains('ScenarioOne')}")
ConfigurationForScenarioOne{

@Bean
public StudentBean getStudentBean(){
...
}
}

在属性文件中我会有类似这样的内容:

conditions.values.options=${CONDITIONS_VALUES_OPTIONS}

然后在运行时提供 CONDITIONS_VALUES_OPTIONS 的值,如下所示:

-DCONDITIONS_VALUES_OPTIONS=ScenarioOne,ScenarioTwo,ScenarioFive

我想要这样做的原因是能够部署应用程序并根据运行时给定的值使用不同的 bean。

我将有几个配置类,这些配置类将根据传递的属性来创建。为了实现这一目标,我试图依靠 Spring Expression 语言来执行以下操作:1-读取属性conditions.values.options,然后将其转换为列表,然后验证该列表是否包含所需的配置字符串。

到目前为止,我已经尝试了几种表达方式,包括:

@ConditionalOnExpression("#{'${conditions.values.options}'.contains('ScenarioOne')}")

和其他类似的表达方式,但没有运气。有人可以帮我看看我在这里缺少什么吗?

最佳答案

我能够使用此获得所需的行为:

@ConditionalOnExpression("#{T(java.util.Arrays).asList('${conditions.values.options}').contains('ScenarioOne')}")

因此对此进行了一些剖析,希望可以帮助其他可能遇到类似问题的人:似乎 spring 将逗号分隔的属性读取为数组,这是假的,因为可以使用 spring boot 完成以下操作:

以下两种说法均有效:

@Value("${property.with.comma.separated.values}")
private List<String> prop;

或者

@Value("${property.with.comma.separated.values}")
private String [] prop;

现在的表达式:

"#{'${conditions.values.options}'.contains('ScenarioOne')}"

将抛出一个错误,指出 Array 类不包含名为“.contains()”的方法因此,这就是为什么我不得不求助于使用某些方法执行:

T(java.util.Arrays).asList('${conditions.values.options}')

要读取逗号分隔值,请将字符串数组转换为列表,然后执行“.contains(..)”方法调用。

我希望有一种更简单的方法来做到这一点,必须在那里进行方法调用似乎有点矫枉过正。

我愿意接受建议😀

关于java - 使用 Spring 表达式语言断言从属性文件加载的属性(具有逗号分隔值)是否包含 "value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61066447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com