【问题标题】:Using Spring expression language to assert if a property (with comma separated values) loaded from a properties file, contains "value"使用 Spring 表达式语言断言从属性文件加载的属性(使用逗号分隔的值)是否包含“值”
【发布时间】:2020-07-18 20:14:48
【问题描述】:

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

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

@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')}")

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

【问题讨论】:

标签: java spring-boot spring-expression-language


【解决方案1】:

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

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

在大括号后面写 contains 方法。

【讨论】:

  • 感谢您的回复,它不起作用,它在“。”之后立即产生语法错误在 .contains(...) 上写着:意想不到的 '.'
【解决方案2】:

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

@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}')

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

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

我愿意接受建议?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2018-09-21
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多