Eureka DiscoveryClient缓存刷新报AbstractMethodError但服务正常问题咨询
错误原因
该报错属于JAX-RS(Java API for RESTful Web Services)规范版本冲突,具体逻辑如下:
- Eureka 客户端底层默认使用 Jersey 1.x 框架发送HTTP请求,Jersey 1.x 实现的是 JAX-RS 1.x 规范,该版本下
javax.ws.rs.core.Response类没有getStatusInfo()方法 - 你的项目中存在额外引入的 JAX-RS 2.x 版本依赖(可能是直接引入,也可能是其他第三方依赖间接引入),2.x版本的
Response类新增了getStatusInfo()方法 - 类加载时优先加载了2.x版本的
Response类,运行时调用getStatusInfo()方法时,Jersey 1.x 的实现类没有对应方法实现,直接抛出AbstractMethodError - 服务本身运行正常是因为服务注册到Eureka的逻辑不受该问题影响,仅拉取Eureka服务注册表、刷新本地缓存的逻辑失败,如果你的服务不需要调用其他注册到Eureka的服务,业务逻辑不会受到直接影响。
修复方案
你可以根据项目实际情况选择以下任意一种方案修复:
- 方案1:排除冲突的JAX-RS 2.x依赖
先通过依赖树命令定位引入JAX-RS 2.x的依赖:
Maven项目执行命令:mvn dependency:tree
Gradle项目执行命令:gradlew dependencies
找到引入javax.ws.rs:javax.ws.rs-api2.0+版本的依赖后,给该依赖添加排除规则,Maven排除示例如下:<dependency> <groupId>冲突依赖的groupId</groupId> <artifactId>冲突依赖的artifactId</artifactId> <version>冲突依赖版本</version> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> </exclusions> </dependency> - 方案2:强制统一JAX-RS版本为1.x
在项目的依赖管理配置中明确指定JAX-RS使用1.x版本,保证全项目版本统一,Maven示例如下:<dependencyManagement> <dependencies> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <version>1.1.1</version> </dependency> </dependencies> </dependencyManagement> - 方案3:替换Eureka客户端的HTTP实现(Spring Cloud项目适用)
如果是Spring Cloud项目,可以直接替换Eureka默认的Jersey实现,从根源避免版本冲突:
第一步:排除eureka-client默认的jersey依赖:
第二步:在配置文件中开启HTTP客户端实现:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <exclusions> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-apache-client4</artifactId> </exclusion> </exclusions> </dependency>eureka: client: http-client: enabled: true
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

