Modi
Modi

Reputation: 2355

Spring boot - @ConditionalOnProperty or @ConditionalOnExpression

I'm using Spring-Boot-1.1.7. My intention is to add a bean to my context according to a value of a property of type string.

I mean, I can see a lot of examples of boolean values such as this:

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

But I want an expression based on a value of a property, for example:

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

or something like that.

Can someone show me an example how to do it?

Upvotes: 30

Views: 56049

Answers (4)

morecore
morecore

Reputation: 1710

If you are using e.g. a string value and want to check if a value is set, you can use a simple "check":

@Component
@ConditionalOnProperty(value = "foo.value")
public class Foo {
    private String value;
    // getter/ setter and other stuff ...
}

If you add: foo.value: bar to your application.yml file the component will be found and added to the application context, but if you do not set a value the component will not be added.

If you want to check if the component is found, you can use: debug: true in your application.yml.

Foo matched:
- @ConditionalOnProperty (foo.value) matched (OnPropertyCondition)

vs

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

Upvotes: 0

davorp
davorp

Reputation: 4236

For property value conditional I used:

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

Upvotes: 37

Modi
Modi

Reputation: 2355

Eventually , this one worked for me:

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

Upvotes: 46

Dave Syer
Dave Syer

Reputation: 58094

If the value you want to compare with is a literal, you need to quote it, and the placeholder would go round the property name (not the whole expression), e.g. ${server.host}=='localhost'

Upvotes: 2

Related Questions