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 e96e6cc5b0bc..6064f0f33279 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 @@ */ @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 93076c457069..0e02b5ec52c1 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 @@ private HttpHost createHttpHost(URI uri) { } @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 571e9cc9a207..216f6f07737d 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 @@ * @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 @@ RestHighLevelClient customRestHighLevelClient1(RestClientBuilder builder) { } + @Configuration(proxyBeanMethods = false) + static class CustomRestClientConfiguration { + + @Bean + RestClient customRestClient(RestClientBuilder builder) { + return builder.build(); + } + + } + @ParameterizedTest @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)