背景
新创建的SpringBoot项目需要用到ElasticSearch,但是因为ES版本为7.0与SpringBoot中的Spring Data Elasticsearch没有合适的版本,在项目启动时给出警告提示。于是决定放弃使用Spring Data Elasticsearch,直接使用elasticsearch-rest-high-level-client来操作ES。在pom文件中添加依赖如下:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.0.0</version>
</dependency>
但是在启动项目后,抛出异常。异常的关键信息如下:
Caused by: java.lang.IncompatibleClassChangeError: Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
解决方案
从异常信息中没有看出什么端倪,最后看了下elasticsearch-rest-high-level-client的依赖,发现问题根源。依赖如下图所示:
错误的依赖.png从依赖中可以看出,有部分依赖的版本并不是我指定的7.0.0,而是7.9.3,这是为什么呢?原来是因为在spring-boot-starter-parent中SpringBoot设定的版本为7.9.3,这导致了部分依赖不正确。解决办法也很简单,在项目的pom.xml文件中properties节点设置elasticsearch.version版本为7.0.0即可。修改内容如下:
pom文件修改.png修改后依赖如下:
修改后的依赖.png再次启动项目,异常消失,完美解决问题。
ES客户端配置
创建ES客户端代码比较简单,整个配置如下:
@Bean
public RestHighLevelClient restHighLevelClient(){
RestClientBuilder builder = RestClient.builder(new HttpHost("127.0.0.1", 9200));
//设置账号和密码
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
Credentials credentials = new UsernamePasswordCredentials("test","test");
credentialsProvider.setCredentials(AuthScope.ANY,credentials);
builder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
return new RestHighLevelClient(builder);
}
配置这个之后我们在使用时只需要使用@Autowrite注入即可使用。关于相关API如何使用可以参考官网,官网的文档也是比较清晰的。
网友评论