使用OkHttp 4.9.3时遭遇java.lang.NoSuchMethodError问题
针对你遇到的问题,以下是具体排查和解决步骤:
核对方法参数顺序
OkHttp 4.x 中,接收字符串的RequestBody.create方法签名为RequestBody.create(MediaType, String),而你的代码写的是RequestBody.create(json, MediaType.parse(...)),参数顺序完全颠倒。旧版本 OkHttp(如3.x)存在反向参数的重载,但4.x已调整该方法签名,这会直接导致找不到对应方法。修改代码为:RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);排查依赖冲突
执行mvn dependency:tree命令,搜索所有com.squareup.okhttp3相关依赖,检查是否存在版本不一致的情况(比如间接引入了3.x版本的OkHttp)。如果发现旧版本依赖,在你的OkHttp依赖中添加排除规则:<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.3</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <!-- 替换为实际冲突的artifactId --> </exclusion> </exclusions> </dependency>验证编译与运行时依赖一致性
在代码中临时添加一行打印,查看运行时加载的RequestBody类来源:System.out.println(RequestBody.class.getProtectionDomain().getCodeSource().getLocation());输出的jar包路径应指向OkHttp 4.9.3版本的文件。如果路径是旧版本jar包,说明运行时环境存在依赖覆盖(比如容器、第三方组件自带了旧版OkHttp),需要调整运行时依赖优先级。
清理Maven缓存并重新构建
执行mvn clean install -U命令,强制清理本地构建缓存并重新下载依赖,避免本地仓库中损坏或版本混乱的jar包影响运行。统一管理OkHttp版本
在pom.xml的dependencyManagement节点中统一声明OkHttp版本,确保所有相关模块(如okhttp、okhttp-urlconnection等)使用同一版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp-bom</artifactId> <version>4.9.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
内容的提问来源于stack exchange,提问作者Abraham Arnold

