繁体   English   中英

使用 Spring 表达式语言断言从属性文件加载的属性(用逗号分隔的值)是否包含“值”

[英]Using Spring expression language to assert if a property (with comma separated values) loaded from a properties file, contains “value”

我有以下问题,我在 spring 引导中有一定的配置 class 包含豆,我想只有在具有值列表的某个属性包含某个值时才创建它。

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

@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 表达式语言来执行以下操作: 1-读取属性conditions.values.options ,然后将其转换为列表,然后验证列表是否包含所需的配置字符串。

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

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

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

我能够使用以下方法获得所需的行为:

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

所以稍微剖析一下,希望能帮助其他可能遇到类似问题的人:似乎 spring 将逗号分隔的属性读取为数组,这是虚假的,因为可以使用 spring 引导完成以下操作:

以下两个陈述是有效的:

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

或者

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

现在表达:

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

会抛出一个错误,指出数组 class 不包含名为 '.contains()' 的方法,因此这就是为什么我不得不求助于一些方法执行:

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

读取逗号分隔值,将 String 数组转换为 List,然后执行 '.contains(..)' 方法调用。

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

我愿意接受建议

您可以尝试像这样编写注释值并检查:

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

在大括号后面写 contains 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM