文章目錄

  • 一、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註解) 掃描了相同的包路徑

解決方案

  1. 分離包路徑(推薦):
@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);
}
}
  1. 或移除註解,讓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版本)

解決方案

  1. 確保Spring Boot與Elasticsearch版本兼容
  2. 顯式排除默認版本並指定正確版本:
<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地址

解決方案

  1. 關閉Elasticsearch健康檢查(推薦):
management:
health:
elasticsearch:
enabled: false
  1. 配置正確的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索引中已有字段類型不一致

解決方案

  1. 刪除舊索引(或重建)後重新啓動應用
  2. 或通過_reindex API遷移數據

2. 查詢結果為空

報錯內容

No documents found for query

原因

  • 分詞器不匹配(如中文未使用IK分詞器)
  • 查詢條件錯誤

解決方案

  1. 通過Kibana檢查索引映射:GET your_index/_mapping
  2. 確認分詞器配置
  3. 打印生成的DSL查詢語句驗證條件

總結

  1. 確保Elasticsearch服務已啓動:使用curl http://localhost:9200驗證
  2. 正確配置連接地址:在application.yml中設置spring.elasticsearch.rest.uris
  3. 處理依賴衝突:排除Netty依賴,確保版本兼容
  4. 分離包路徑:避免MyBatis和Elasticsearch Repository掃描衝突
  5. 關閉健康檢查:如果不需要,設置management.health.elasticsearch.enabled=false
  6. 處理Netty衝突:添加EsConfig配置類
  7. 檢查配置格式:確保YAML縮進正確,無拼寫錯誤