I expect my controller to be loaded when the ElasticsearchDataAutoConfiguration bean exists, but my ElasticSearchController.java has not been loaded as a bean.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
@SpringBootApplication
public class Boot3Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Boot3Application.class, args);
boolean containsBean = run.containsBean("org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration");
// true
log.info("containsBean: {}", containsBean);
ElasticsearchDataAutoConfiguration bean = run.getBean(ElasticsearchDataAutoConfiguration.class);
}
}
package com.example.boot3.controller;
@RestController
@RequestMapping("/es")
@DependsOn("org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration")
@ConditionalOnBean(ElasticsearchDataAutoConfiguration.class)
public class ElasticSearchController {
}
package com.example.boot3.repository;
@ConditionalOnBean(ElasticsearchDataAutoConfiguration.class)
public interface IProductRepository extends ElasticsearchRepository<Product, String> {
}
IProductRepository matched:
- @ConditionalOnBean (types: org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; SearchStrategy: all) found bean 'org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration' (OnBeanCondition)
ElasticSearchController:
Did not match:
- @ConditionalOnBean (types: org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; SearchStrategy: all) did not find any beans of type org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration (OnBeanCondition)
Project directory structure
Comment From: wilkinsona
This won't work as application configuration is processed before auto-configuration. This means that ElasticsearchDataAutoConfiguration won't have ben processed and defined as a bean when your ElasticSearchController is being processed. @DependsOn does not help with that as it does not affect the order in which configuration classes are processed.
As described in the javadoc of @ConditionalOnBean, it is only intended for use on auto-configuration. You should not use it on a @Controller that's found through component scanning.
If you have any further questions, please follow up on Stack Overflow or Gitter. As mentioned in the guidelines for contributing, we prefer to use GitHub issues only for bugs and enhancements.