前提:提前下载、配置好 elasticsearch,不会的可以点击下面的链接: Elasticsearch 保姆级下载安装配置
文章目录
- 解决 maven 引入 ElasticSearch 依赖后各种报错
- 一. spring boot 整合 elasticsearch
- 二、测试:看能不能连上
- 三、解决各种报错
- 报错一:java.lang.IllegalStateException: Failed to load ApplicationContext 或 Error creating bean with name 'restHighLevelClient' defined in class path resource
- 报错二:Failed to instantiate [co.elastic.clients.elasticsearch.ElasticsearchClient]: Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
- 报错三:java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/StreamReadConstraints
- 报错四:co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/indices.create] failed: [invalid_index_name_exception] Invalid index name [MyIndex], must be lowercase
解决 maven 引入 ElasticSearch 依赖后各种报错
一. spring boot 整合 elasticsearch
1、ES 7.15.X 之后版本的依赖和配置类:本人使用的这个版本
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>7.17.14</version> <!--指定Elasticsearch的版本-->
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
2、写配置类:
//注意这个包不导错了
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchConfiguration {
@Bean
public ElasticsearchClient restHighLevelClient() {
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)
).build();
ElasticsearchTransport elasticsearchTransport = new
RestClientTransport(restClient,new JacksonJsonpMapper());
return new ElasticsearchClient(elasticsearchTransport);
}
}
再导入依赖和写入配置类之后,就开始测试是否成功连接到,直接去测试类写:
二、测试:看能不能连上
直接写测试类测试:比如,下面代码就是 创建一个索引:
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
//注入属性
@Autowired
private ElasticsearchClient client;
@Test
public void test() throws Exception {
CreateIndexRequest request = new
CreateIndexRequest.Builder().index("user_test").build();
// 创建索引:不支持大写字母
CreateIndexResponse createIndexResponse =
client.indices().create(request);
// 响应状态:成功为true
System.out.println("索引操作 = " + createIndexResponse.acknowledged());
System.out.println(createIndexResponse.index());
}
/*
CreateIndexRequest request = new
CreateIndexRequest.Builder().index("user_test").build();
CreateIndexResponse createIndexResponse = client.indices().create(request);
等同于下面这个代码:
GetIndexResponse getIndexResponse = client.indices().get(e ->
e.index("user_test"));
*/
}
刷新 Elasticsearch Head,可以看到创建的索引,如下图所示:

提示:Elasticsearch Head 是个管理工具,可以查看下面这篇文章,详细介绍了 Elasticsearch Head 的安装配置:点击查看
三、解决各种报错
运行上面的代码,会报各种错误。或者,引入 Elasticsearch 会报各种错,可以看下面解决:
首先,所有的报错,先看自己的版本是否对应:
比如:这里我选的就是:Elasticsearch7.17.14,Spring Boot2.17.14。但是引入依赖之后会发现 Spring Boot2.17.14 和 Elasticsearch7.17.14 对应不起来,于是经测试,Spring
Boot2.17.17刚好对应 Elasticsearch7.17.14。
提示:也不是需要完全对应,只要上下相差不是很大就行(也最好不要低版本去贴合高版本),如果后续测试报错,首先检查版本是否匹配。下图的错误就有可能是版本的问题:

报错一:java.lang.IllegalStateException: Failed to load ApplicationContext 或 Error creating bean with name ‘restHighLevelClient’ defined in class path resource
解决:首先查看依赖,spring boot 和 elasticsearch 版本是否对应:

对应成功:

假如版本都对应,还是报错,如下:
报错二:Failed to instantiate [co.elastic.clients.elasticsearch.ElasticsearchClient]: Factory method ‘restHighLevelClient’ threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
解决:引入下面依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
假如还是报错,如下:
报错三:java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/StreamReadConstraints
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/StreamReadConstraints
at com.fasterxml.jackson.databind.util.TokenBuffer.<init>(TokenBuffer.java:65)
at com.fasterxml.jackson.databind.util.TokenBuffer.<init>(TokenBuffer.java:170)
at co.elastic.clients.json.jackson.JacksonJsonpParser.getJsonData(JacksonJsonpParser.java:431)
at co.elastic.clients.json.JsonData.from(JsonData.java:162)
at co.elastic.clients.json.JsonData.lambda$static$0(JsonData.java:169)
at co.elastic.clients.json.JsonpDeserializer$3.deserialize(JsonpDeserializer.java:136)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
解决:上面这个版本过高,请降低这个版本,比如:
<!--版本不能过高-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
报错四:co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/indices.create] failed: [invalid_index_name_exception] Invalid index name [MyIndex], must be lowercase
创建索引时,不支持大写字母

结束!!!
生活除了代码,还有蓝天白云!!!!
请给点时间给自己!!!!!
5717

被折叠的 条评论
为什么被折叠?



