Spring Boot - @ConditionalOnProperty或@ConditionalOnExpression

28

我正在使用Spring-Boot-1.1.7。 我的目的是根据一个字符串类型的属性值将一个bean添加到我的上下文中。

我的意思是,我可以看到很多布尔值的示例,例如这样:

@ConditionalOnExpression("${xxx.enabled:true}")

但我想要一个基于属性值的表达式,例如:

@ConditionalOnExpression("${server.host==localhost} or ${server.port==8080} ")

或者类似的东西。

有人能给我展示一个如何做的例子吗?

4个回答

41

最终,这一个对我有效:

@ConditionalOnExpression("'${server.host}'=='localhost'")

是的,那会起作用(显然)。您正在比较两个文字常量。 - Dave Syer
1
只是确认一下,即使它被引用了,${server.host}也能正确解析吗?所以如果server.host是'foobar',那么表达式会被评估为'foobar'=='localhost'吗? - JBCP
是的,只有在引用它时才能正确执行评估。 - Modi

35

对于属性值条件,我使用了:

@ConditionalOnProperty(name="server.host", havingValue="localhost")

2

如果您想比较的值是字面量,您需要将其引用起来,并且占位符会围绕属性名(而不是整个表达式)进行处理,例如${server.host}=='localhost'


1
你的示例程序出现了以下异常:' Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'localhost' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext ' - maybe not public?' 我在下面的回答中添加了一个可行的表达式(令人惊讶的是,我必须说)。无论如何,谢谢。 - Modi

0
如果您正在使用字符串值并希望检查是否设置了某个值,可以使用简单的“检查”:
@Component
@ConditionalOnProperty(value = "foo.value")
public class Foo {
    private String value;
    // getter/ setter and other stuff ...
}

如果您在application.yml文件中添加foo.value: bar,则该组件将被找到并添加到应用程序上下文中,但是如果您不设置值,则该组件将不会被添加。
如果您想检查组件是否被找到,可以在application.yml中使用debug: true
Foo matched:
- @ConditionalOnProperty (foo.value) matched (OnPropertyCondition)

对比

Foo: Did not match:
- @ConditionalOnProperty (foo.value) did not find property 'foo.value' (OnPropertyCondition)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接