From d6bead1a2adfdddb570600f2212fcec488330a5a Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Mon, 15 Nov 2021 09:58:28 +0100 Subject: [PATCH] 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 --- ...sticsearchRestClientAutoConfiguration.java | 7 ++---- ...ElasticsearchRestClientConfigurations.java | 3 ++- ...earchRestClientAutoConfigurationTests.java | 25 ++++++++++++++++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfiguration.java index e96e6cc5b0..6064f0f332 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfiguration.java @@ -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, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java index 93076c4570..0e02b5ec52 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java @@ -112,7 +112,8 @@ class ElasticsearchRestClientConfigurations { } @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingBean(RestHighLevelClient.class) + @ConditionalOnClass(RestHighLevelClient.class) + @ConditionalOnMissingBean({ RestHighLevelClient.class, RestClient.class }) static class RestHighLevelClientConfiguration { @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java index 571e9cc9a2..216f6f0773 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java @@ -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)