From f7d1aab9f39033a105aa9bbd18ab63a2fbc4fc80 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 3 Jun 2014 20:57:57 +0100 Subject: [PATCH] Make ElasticSearchAutoConfiguration conditional on SD Elasticsearch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ElasticSearchAutoConfiguration depends on two Spring Data Elasticsearch classes (TransportClientFactoryBean and NodeClientFactoryBean), however it’s only conditional on Elasticsearch itself being on the classpath. This lead to start up failures due to a ClassNotFoundException. Its @ConditionalOnClass configuration has been updated so that the auto-configuration will only be enabled if both Elasticsearch and Spring Data Elasticsearch are on the classpath. The dependencies on TransportClientFactoryBean and NodeClientFactoryBean were ‘hidden’ in ElasticsearchProperties. The logic that uses these types has been moved into ElasticSearchAutoConfiguration so that the usage of the types and the related @ConditionalOnClass configuration is in the same file. Fixes #1023 --- .../ElasticsearchAutoConfiguration.java | 36 +++++++++++++++++-- .../ElasticsearchProperties.java | 34 +----------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchAutoConfiguration.java index 1a3dfe6948d..8074b947050 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchAutoConfiguration.java @@ -25,17 +25,22 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.elasticsearch.client.NodeClientFactoryBean; +import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; +import org.springframework.util.StringUtils; /** * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration * Auto-configuration} for Elasticsearch. - * + * * @author Artur Konczak * @author Mohsin Husen + * @author Andy Wilkinson * @since 1.1.0 */ @Configuration -@ConditionalOnClass(Client.class) +@ConditionalOnClass({ Client.class, TransportClientFactoryBean.class, + NodeClientFactoryBean.class }) @EnableConfigurationProperties(ElasticsearchProperties.class) public class ElasticsearchAutoConfiguration implements DisposableBean { @@ -48,10 +53,35 @@ public class ElasticsearchAutoConfiguration implements DisposableBean { @Bean public Client elasticsearchClient() { - this.client = this.properties.createClient(); + try { + if (StringUtils.hasLength(this.properties.getClusterNodes())) { + this.client = createTransportClient(); + } + else { + this.client = createNodeClient(); + } + } + catch (Exception ex) { + throw new IllegalStateException(ex); + } return this.client; } + private Client createNodeClient() throws Exception { + NodeClientFactoryBean factory = new NodeClientFactoryBean(true); + factory.setClusterName(this.properties.getClusterName()); + factory.afterPropertiesSet(); + return factory.getObject(); + } + + private Client createTransportClient() throws Exception { + TransportClientFactoryBean factory = new TransportClientFactoryBean(); + factory.setClusterName(this.properties.getClusterName()); + factory.setClusterNodes(this.properties.getClusterNodes()); + factory.afterPropertiesSet(); + return factory.getObject(); + } + @Override public void destroy() throws Exception { if (this.client != null) { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java index bea364afcda..45686af5efd 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java @@ -16,15 +16,11 @@ package org.springframework.boot.autoconfigure.elasticsearch; -import org.elasticsearch.client.Client; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.data.elasticsearch.client.NodeClientFactoryBean; -import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; -import org.springframework.util.StringUtils; /** * Configuration properties for Elasticsearch. - * + * * @author Artur Konczak * @author Mohsin Husen * @since 1.1.0 @@ -36,8 +32,6 @@ public class ElasticsearchProperties { private String clusterNodes; - private boolean local = true; - public String getClusterName() { return this.clusterName; } @@ -53,30 +47,4 @@ public class ElasticsearchProperties { public void setClusterNodes(String clusterNodes) { this.clusterNodes = clusterNodes; } - - public Client createClient() { - try { - return (StringUtils.hasLength(this.clusterNodes) ? createTransportClient() - : createNodeClient()); - } - catch (Exception ex) { - throw new IllegalStateException(ex); - } - } - - private Client createNodeClient() throws Exception { - NodeClientFactoryBean factory = new NodeClientFactoryBean(this.local); - factory.setClusterName(this.clusterName); - factory.afterPropertiesSet(); - return factory.getObject(); - } - - private Client createTransportClient() throws Exception { - TransportClientFactoryBean factory = new TransportClientFactoryBean(); - factory.setClusterName(this.clusterName); - factory.setClusterNodes(this.clusterNodes); - factory.afterPropertiesSet(); - return factory.getObject(); - } - }