Issue
I would like the execution of the event handler to depend on whether the property is set to true or false in applecation.yaml file. I have three yaml files (test, dev, prod) and I have set the settings in them:
for application-dev.yml
page-cache:
starting: false
for application-test.yml
page-cache:
starting: true
for application-prod.yml
page-cache:
starting: true
And I need not to write 'dev' or 'test' in condition myself, but to read true or false from yaml files.
For example: condition = "@serviceEnabled == true"
, does not work.
@Service
public class ServiceImpl{
@Value("${page-cache.starting}")
private Boolean serviceEnabled;
/means that when running dev will be false and the method will not run and this code is working
@EventListener(
value = ApplicationReadyEvent.class,
condition = "@environment.getActiveProfiles()[0] != 'dev'")
public void updateCacheAfterStartup() {
log.info("Info add starting...");
someService.getInfo();
}
I tried to do as in this article, but it doesn't work for me .
Evaluate property from properties file in Spring's @EventListener(condition = "...")
I also tried the same option
@Service
public class ServiceImpl{
// @Lazy private final ServiceImpl serviceImpl
@Value("${page-cache.starting}")
private Boolean serviceEnabled;
public Boolean isServiceEnabled() {
return this.serviceEnabled;
}
public Boolean getServiceEnabled() {
return serviceEnabled;
}
@EventListener(
value = ApplicationReadyEvent.class,
condition = "@ServiceImpl.serviceEnabled")
public void updateCacheAfterStartup() {
log.info("Info add starting...");
someService.getInfo();
}
Solution
Make sure the YAML format is correct in
application-test.yml
,application-prd.yml
,...example:
application-dev.yml
page-cache: starting: false
ServiceImpl
must be a component/bean, so annotate your class with@Service
,@Component
or use@Bean
if the instance is created in a@Configuration
class.
Extra tip:
You could use condition = "! @environment.acceptsProfiles('dev')"
instead of condition = "@environment.getActiveProfiles()[0] != 'dev'"
that way the order of active profiles does not matter
or define when the condition is valid: condition = "@environment.acceptsProfiles('test', 'prod')"
UPDATE:
You could also directly use page-cache.starting
in the condition.
@EventListener(
value = ApplicationReadyEvent.class,
condition = "@environment.getProperty('page-cache.starting')")
public void updateCacheAfterStartup() {
// update the cache
}
Here updateCacheAfterStartup()
will only be triggered at startup when page-cache.starting
is true
. If set to false
or when not present the method will not be called.
If you want to force that page-cache.starting
is provided (in all profiles) you should use: condition="@environment.getRequiredProperty('page-cache.starting')"
Answered By - Dirk Deyne
Answer Checked By - Terry (JavaFixing Volunteer)