Elasticsearch java客户端初始化失败



我在尝试运行连接到elasticsearch的应用程序时收到此错误消息。

An attempt was made to call the method org.elasticsearch.client.RestHighLevelClient.<init>(Lorg/elasticsearch/client/RestClientBuilder;)V but it does not exist. Its class, org.elasticsearch.client.RestHighLevelClient, is available from the following locations:
jar:file:/path/application/target/application-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/elasticsearch-rest-high-level-client-5.6.3.jar!/org/elasticsearch/client/RestHighLevelClient.class
It was loaded from the following location:
jar:file:/path/application/target/application-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/elasticsearch-rest-high-level-client-5.6.3.jar!/
Action:
Correct the classpath of your application so that it contains a single, compatible version of org.elasticsearch.client.RestHighLevelClient

该应用程序构建没有错误,并且在我的maven存储库中只存在一个版本的elasticsearch SDK。

这是我的pom:的相关部分

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath />
</parent>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>5.6.3</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>

这是我在运行应用程序时遇到的例外:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.RestHighLevelClient]: Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoSuchMethodError: org.elasticsearch.client.RestHighLevelClient.<init>(Lorg/elasticsearch/client/RestClientBuilder;)V

这就是我初始化RestHighLevelClient:的方式

RestClientBuilder builder = RestClient
.builder(new HttpHost(hostname, port, scheme));
builder.setMaxRetryTimeoutMillis(timeout);
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder.build());

Spring引导将尝试自动配置elasticsearch,该搜索将在内部使用elastic6RestHighLevelClient(org.lasticsearch.client.RestClientBuilder构建器(来创建弹性客户端。如果您想连接到较旧版本的弹性搜索,请排除弹性搜索自动配置。

@EnableAutoConfiguration(exclude={ElasticsearchAutoConfiguration.class, RestClientAutoConfiguration.class})

通过查看异常

java.lang.NoSuchMethodError: org.elasticsearch.client.RestHighLevelClient.<init>(Lorg/elasticsearch/client/RestClientBuilder;)

RestHighLevelClient中没有构造函数,它将RestClientBuilder作为<version>5.6.3</version>中的参数。

您是否尝试使用版本<version>7.0.0-alpha1</version>

更新:

异常An attempt was made to call the method org.elasticsearch.client.RestHighLevelClient.<init>(Lorg/elasticsearch/client/RestClientBuilder;告诉,代码是它试图执行属于弹性搜索版本6的方法。在您的情况下,您可能在运行时提供了多个版本的Elasticsearch库,或者您的代码可能是由版本6编写的,但在运行时提供了版本5。

如果您使用的是Spring Boot 2.3.x+Elasticsearch客户端5.6.6,这里有一个配置参考,看看它是否有帮助
我们最近将Spring Boot升级到2.3.3,而ELK仍在5.6.6上。错误是关于Spring自动配置ESRestClient,因此另一个解决方案是";"手动配置";,以后可以在其他地方使用。

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EsConfig {
@Value("${elasticsearch.host}")
private String esHost;
@Value("${elasticsearch.port}")
private int esPort;

@Value("${elasticsearch.prefix}")
private String esPrefix;
@Bean
public RestClient lowLevelClient() {
return RestClient.builder(new HttpHost(esHost, esPort, "http")).setPathPrefix(esPrefix)
.setRequestConfigCallback(builder -> builder.setConnectTimeout(1000).setSocketTimeout(5000)).build();
}
@Bean
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(this.lowLevelClient());
}
// ------ before upgrade
//  @Bean
//  public RestHighLevelClient restHighLevelClient() {
//      RestClient rc = RestClient.builder(new HttpHost(esHost, esPort, "http")).setPathPrefix(esPrefix)
//      .setRequestConfigCallback(builder -> builder.setConnectTimeout(1000).setSocketTimeout(5000)).build();
//      return new RestHighLevelClient(rc);
//  }
}

pom:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath /> 
</parent>
<!-- ..................  -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>5.6.6</version>
</dependency>

相关内容

最新更新