文章目錄
- 一、Bean定義衝突
- 1. MyBatis與Elasticsearch Repository掃描路徑衝突
- 二、依賴配置問題
- 1. 缺少必要依賴或依賴版本不匹配
- 三、Elasticsearch服務連接問題
- 1. Elasticsearch服務未啓動或地址配置錯誤
- 四、版本兼容性問題
- 1. Spring Boot與Elasticsearch版本不兼容
- 五、Elasticsearch健康檢查問題
- 1. Actuator健康檢查失敗
- 六、Netty與Spring Data Elasticsearch衝突
- 1. Netty與Spring Data Elasticsearch的衝突
- 七、配置文件格式錯誤
- 1. 配置文件格式錯誤(YAML縮進問題)
- 八、其他常見問題
- 1. 字段映射衝突
- 2. 查詢結果為空
- 總結
一、Bean定義衝突
1. MyBatis與Elasticsearch Repository掃描路徑衝突
報錯內容:
org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'articlesRepository' for bean class [com.dragon.springboot3vue3.mapper.ArticlesRepository] conflicts with existing, non-compatible bean definition of same name and class [org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactoryBean]
原因:
@MapperScan(MyBatis註解) 和@EnableElasticsearchRepositories(Spring Data註解) 掃描了相同的包路徑
解決方案:
- 分離包路徑(推薦):
@SpringBootApplication
@MapperScan("com.example.mapper") // MyBatis Mapper
@EnableElasticsearchRepositories("com.example.es.repository") // ES Repository
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 或移除註解,讓Spring Boot自動掃描:
@SpringBootApplication
// 註釋掉以下兩行
// @MapperScan("com.example.mapper")
// @EnableElasticsearchRepositories("com.example.es.repository")
public class Application {
// ...
}
二、依賴配置問題
1. 缺少必要依賴或依賴版本不匹配
報錯內容:
NoSuchBeanDefinitionException: No bean named 'elasticsearchTemplate' available
原因:
- 未正確引入Spring Data Elasticsearch依賴
- 依賴版本與Spring Boot不兼容
解決方案:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<!-- 排除可能導致衝突的 Netty 依賴 -->
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</exclusion>
</exclusions>
</dependency>
三、Elasticsearch服務連接問題
1. Elasticsearch服務未啓動或地址配置錯誤
報錯內容:
org.elasticsearch.client.ResponseException: method [GET], host [http://localhost:9200], URI [/_cluster/health/], status line [HTTP/1.1 404 Not Found]
Not Found
原因:
- Elasticsearch服務未啓動
- 配置的地址與實際Elasticsearch地址不匹配(如配置了localhost但實際在其他主機)
解決方案:
spring:
elasticsearch:
rest:
uris: http://your-elasticsearch-server:9200 # 替換為實際地址
四、版本兼容性問題
1. Spring Boot與Elasticsearch版本不兼容
報錯內容:
Factory method 'highLevelClient' threw exception
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.elasticsearch.client.RestHighLevelClient]:
Factory method 'highLevelClient' threw exception
原因:
- Spring Boot版本與Elasticsearch客户端版本不兼容
- 依賴衝突(如Spring Boot 2.0.3默認依賴Elasticsearch 5.6.10,但項目中使用了7.5.2版本)
解決方案:
- 確保Spring Boot與Elasticsearch版本兼容
- 顯式排除默認版本並指定正確版本:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.5.2</version>
</dependency>
五、Elasticsearch健康檢查問題
1. Actuator健康檢查失敗
報錯內容:
ElasticsearchHealthCheck failed
原因:
- Spring Boot Actuator默認使用
http://localhost:9200進行健康檢查 - Elasticsearch部署在非localhost地址
解決方案:
- 關閉Elasticsearch健康檢查(推薦):
management:
health:
elasticsearch:
enabled: false
- 配置正確的Elasticsearch地址:
spring:
elasticsearch:
rest:
uris: http://your-elasticsearch-server:9200
六、Netty與Spring Data Elasticsearch衝突
1. Netty與Spring Data Elasticsearch的衝突
報錯內容:
availableProcessors is already set to [8], rejecting [8]
原因:
- Spring Data Elasticsearch與Webflux組件(基於Netty)發生衝突
解決方案:
@Configuration
public class EsConfig {
@PostConstruct
void init() {
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
}
七、配置文件格式錯誤
1. 配置文件格式錯誤(YAML縮進問題)
報錯內容:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'elasticsearchRestClient' defined in class path resource
[org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRestClientAutoConfiguration.class]:
Cannot create a ElasticsearchRestClient for the given configuration.
原因:
- YAML文件縮進不正確或拼寫錯誤
解決方案:
確保配置正確:
spring:
elasticsearch:
rest:
uris: http://localhost:9200
八、其他常見問題
1. 字段映射衝突
報錯內容:
ElasticsearchStatusException: MapperParsingException[failed to parse]
原因:
- 實體類字段類型與ES索引中已有字段類型不一致
解決方案:
- 刪除舊索引(或重建)後重新啓動應用
- 或通過_reindex API遷移數據
2. 查詢結果為空
報錯內容:
No documents found for query
原因:
- 分詞器不匹配(如中文未使用IK分詞器)
- 查詢條件錯誤
解決方案:
- 通過Kibana檢查索引映射:
GET your_index/_mapping - 確認分詞器配置
- 打印生成的DSL查詢語句驗證條件
總結
- 確保Elasticsearch服務已啓動:使用
curl http://localhost:9200驗證 - 正確配置連接地址:在application.yml中設置
spring.elasticsearch.rest.uris - 處理依賴衝突:排除Netty依賴,確保版本兼容
- 分離包路徑:避免MyBatis和Elasticsearch Repository掃描衝突
- 關閉健康檢查:如果不需要,設置
management.health.elasticsearch.enabled=false - 處理Netty衝突:添加
EsConfig配置類 - 檢查配置格式:確保YAML縮進正確,無拼寫錯誤
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。