Java 使用Spring表达式语言断言从属性文件加载的属性(带有逗号分隔值)是否包含;“价值”;
我有以下问题,我在spring boot中有一个特定的配置类,它包含bean,我只希望在具有值列表的特定属性包含特定值时创建该类 现在,configuration类看起来如下所示:Java 使用Spring表达式语言断言从属性文件加载的属性(带有逗号分隔值)是否包含;“价值”;,java,spring-boot,spring-expression-language,Java,Spring Boot,Spring Expression Language,我有以下问题,我在spring boot中有一个特定的配置类,它包含bean,我只希望在具有值列表的特定属性包含特定值时创建该类 现在,configuration类看起来如下所示: @ConditionalOnExpression(“{'${conditions.values.options}.”包含('scenarione')}”) 塞纳里奥酮的配置{ @豆子 public StudentBean getStudentBean(){ ... } } 在属性文件中,我会有如下内容: condi
@ConditionalOnExpression(“{'${conditions.values.options}.”包含('scenarione')}”)
塞纳里奥酮的配置{
@豆子
public StudentBean getStudentBean(){
...
}
}
在属性文件中,我会有如下内容:
conditions.values.options=${CONDITIONS_VALUES_OPTIONS}
然后在运行时提供条件\u值\u选项的值,如下所示:
-DCONDITIONS_VALUES_OPTIONS=ScenarioOne,ScenarioTwo,ScenarioFive
我之所以希望这样做,是为了能够部署应用程序,并根据运行时给定的值使用不同的bean
我将有几个这样的配置类,它们将根据传递这些属性中的哪些属性来创建。
为了实现这一点,我试图依靠Spring表达式语言来完成以下工作:
1-读取属性条件.值.选项
,然后将其转换为列表,然后验证列表是否包含所需的配置字符串
到目前为止,我尝试了几种表达方式,包括:
@ConditionalOnExpression("#{'${conditions.values.options}'.contains('ScenarioOne')}")
和其他类似的表达,没有运气。有人能帮我看看我这里缺少什么吗?你能试着这样写你的注释值并检查一下:
@ConditionalOnExpression("#{${conditions.values.options}}.contains('ScenarioOne')")
在花括号后写contains方法。我使用以下方法获得了所需的行为:
@ConditionalOnExpression("#{T(java.util.Arrays).asList('${conditions.values.options}').contains('ScenarioOne')}")
因此,稍微剖析一下这一点,希望能帮助其他可能遇到类似问题的人:
spring似乎以数组的形式读取逗号分隔的属性,这是假的,因为可以使用spring boot执行以下操作:
以下两种说法是有效的:
@Value("${property.with.comma.separated.values}")
private List<String> prop;
现在表达:
"#{'${conditions.values.options}'.contains('ScenarioOne')}"
将抛出一个错误,指出数组类不包含名为“.contains()的方法”
因此,这就是为什么我不得不使用一些方法执行:
T(java.util.Arrays).asList('${conditions.values.options}')
要读取逗号分隔的值,请将字符串数组转换为列表,然后执行“.contains(..)”方法调用
我希望有一种更简单的方法来实现它,在那里必须进行方法调用,这似乎有些过分了
我对建议持开放态度感谢您的响应,它不起作用,它在.contains(…)上的“.”读取:意外“.”之后立即产生语法错误
T(java.util.Arrays).asList('${conditions.values.options}')