You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Data集成ElasticSearch时遭遇NoSuchMethodError问题求助

解决Spring Data Elasticsearch集成时的Netty版本冲突问题

从你提供的错误日志和配置来看,这个问题的核心是Netty版本冲突,导致io.netty.util.ResourceLeakDetector.addExclusions方法找不到——这个方法在某些旧版本的Netty中不存在,而你的项目里同时引入了不兼容的Netty版本。

问题分析

你使用的spring-boot-starter-data-elasticsearch:2.1.15.RELEASE属于Spring Boot 2.1.x分支,这个版本依赖的Elasticsearch TransportClient对应的Netty版本是4.1.39.Final左右。如果你的项目中其他依赖(比如Spring Cloud组件、其他第三方库)引入了更高或更低版本的Netty,就会出现类方法不兼容的问题,触发NoSuchMethodError

解决方案

这里提供几个可行的解决思路,按推荐程度排序:

1. 升级Spring Boot版本(推荐)

Spring Boot 2.1.x已经是比较老旧的版本,后续的2.3.x/2.4.x分支不仅修复了很多依赖冲突问题,还将Spring Data Elasticsearch的客户端从弃用的TransportClient切换为RestHighLevelClient,更符合Elasticsearch的官方推荐。

修改你的pom依赖,升级Spring Boot版本(比如2.3.12.RELEASE,这是2.3分支的稳定版本):

<!-- 首先确保Spring Boot的parent版本升级 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/>
</parent>

<!-- 然后spring-boot-starter-data-elasticsearch不需要指定版本,会由parent自动管理 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

同时,注意调整你的配置文件:RestHighLevelClient的配置和TransportClient不同,你需要修改为:

spring.elasticsearch.rest.uris=http://localhost:9200
# 如果有账号密码的话添加下面两行
# spring.elasticsearch.rest.username=xxx
# spring.elasticsearch.rest.password=xxx

2. 锁定Netty版本(适合无法升级Spring Boot的场景)

如果你暂时无法升级Spring Boot,可以通过Maven的dependencyManagement强制指定Netty版本,和Spring Boot 2.1.15.RELEASE依赖的版本保持一致:

在pom.xml中添加:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.39.Final</version>
        </dependency>
        <!-- 如果你项目中用到了单独的Netty模块,也可以分别锁定 -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-buffer</artifactId>
            <version>4.1.39.Final</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-transport</artifactId>
            <version>4.1.39.Final</version>
        </dependency>
    </dependencies>
</dependencyManagement>

添加后,执行mvn dependency:tree命令检查,确保所有Netty相关依赖的版本都是4.1.39.Final

3. 检查Elasticsearch服务器版本兼容性

另外需要注意:Spring Data Elasticsearch和Elasticsearch服务器版本必须兼容。spring-boot-starter-data-elasticsearch:2.1.15.RELEASE对应的Elasticsearch服务器版本是6.2.2,如果你的服务器是7.x版本,也会出现兼容性问题。如果是这种情况,要么升级Spring Boot版本来匹配7.x的Elasticsearch,要么将服务器降级到6.2.2版本。

验证步骤

  1. 修改依赖或配置后,执行mvn clean install清理并重新构建项目
  2. 启动项目,观察日志是否还有Netty相关的错误
  3. 尝试调用Elasticsearch相关接口,验证功能是否正常

内容的提问来源于stack exchange,提问作者Vatsal Rahul

火山引擎 最新活动