Expose RestClientBuilder when RestHighLevelClient is not available

This commits exposes the RestClientBuilder as a bean even when the
RestHighLevelClient is not available. It allows users to create their
own RestClient beans using the Spring Boot configured RestClientBuilder
when they are not using the RestHighLevelClient.

Fixes gh-28655
This commit is contained in:
Filip Hrisafov
2021-11-15 09:58:28 +01:00
committed by Brian Clozel
parent 6e06e69bba
commit d6bead1a2a
3 changed files with 26 additions and 9 deletions

View File

@@ -16,12 +16,10 @@
package org.springframework.boot.autoconfigure.elasticsearch;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientConfigurations.RestClientBuilderConfiguration;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientConfigurations.RestClientSnifferConfiguration;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientConfigurations.RestHighLevelClientConfiguration;
@@ -38,8 +36,7 @@ import org.springframework.context.annotation.Import;
*/
@SuppressWarnings("deprecation")
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RestHighLevelClient.class)
@ConditionalOnMissingBean(RestClient.class)
@ConditionalOnClass(RestClientBuilder.class)
@EnableConfigurationProperties({ ElasticsearchProperties.class, ElasticsearchRestClientProperties.class,
DeprecatedElasticsearchRestClientProperties.class })
@Import({ RestClientBuilderConfiguration.class, RestHighLevelClientConfiguration.class,

View File

@@ -112,7 +112,8 @@ class ElasticsearchRestClientConfigurations {
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(RestHighLevelClient.class)
@ConditionalOnClass(RestHighLevelClient.class)
@ConditionalOnMissingBean({ RestHighLevelClient.class, RestClient.class })
static class RestHighLevelClientConfiguration {
@Bean

View File

@@ -55,6 +55,7 @@ import static org.mockito.Mockito.verifyNoInteractions;
* @author Brian Clozel
* @author Vedran Pavic
* @author Evgeniy Cheban
* @author Filip Hrisafov
*/
class ElasticsearchRestClientAutoConfigurationTests {
@@ -64,14 +65,22 @@ class ElasticsearchRestClientAutoConfigurationTests {
@Test
void configureShouldOnlyCreateHighLevelRestClient() {
this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(RestClient.class)
.hasSingleBean(RestHighLevelClient.class));
.hasSingleBean(RestClientBuilder.class).hasSingleBean(RestHighLevelClient.class));
}
@Test
void configureWithoutRestHighLevelClientShouldOnlyCreateRestClientBuilder() {
this.contextRunner.withClassLoader(new FilteredClassLoader(RestHighLevelClient.class))
.run((context) -> assertThat(context).doesNotHaveBean(RestClient.class)
.doesNotHaveBean(RestHighLevelClient.class).hasSingleBean(RestClientBuilder.class));
}
@Test
void configureWhenCustomRestClientShouldBackOff() {
this.contextRunner.withBean("customRestClient", RestClient.class, () -> mock(RestClient.class))
this.contextRunner.withUserConfiguration(CustomRestClientConfiguration.class)
.run((context) -> assertThat(context).doesNotHaveBean(RestHighLevelClient.class)
.hasSingleBean(RestClient.class).hasBean("customRestClient"));
.hasSingleBean(RestClientBuilder.class).hasSingleBean(RestClient.class)
.hasBean("customRestClient"));
}
@Test
@@ -304,6 +313,16 @@ class ElasticsearchRestClientAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
static class CustomRestClientConfiguration {
@Bean
RestClient customRestClient(RestClientBuilder builder) {
return builder.build();
}
}
@ParameterizedTest
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)