集成Outlook API遇NoSuchMethodError问题求助(Retrofit+OkHttp)
嘿,这个NoSuchMethodError我太熟了——本质就是依赖版本不兼容搞的鬼,具体原因拆解如下:
你用的OkHttp 3.9.1需要依赖Okio 1.13.0,这个版本的BufferedSource类才有rangeEquals(JLokio/ByteString;)Z这个方法。但你的项目里肯定存在更低版本的Okio(大概率是被其他依赖间接引入的),运行时JVM加载了旧版本的Okio,自然找不到这个方法,就抛出错误了。
另外还有个小问题:你用的Retrofit 2.3.0默认依赖的是OkHttp 3.8.1,但你手动加了logging-interceptor 3.9.1,这会强制把OkHttp版本升级到3.9.1,这种跨版本混搭也容易引发兼容问题。
给你两个靠谱的解决方案:
方案1:统一OkHttp版本(适配现有Retrofit 2.3.0,推荐)
把logging-interceptor的版本改成和Retrofit 2.3.0匹配的3.8.1,这样所有OkHttp相关依赖版本一致,Maven会自动拉取对应的Okio版本,从根源避免冲突:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>logging-interceptor</artifactId> <version>3.8.1</version> </dependency>
方案2:升级Retrofit到兼容OkHttp 3.9.1的版本
如果你不想改OkHttp的版本,可以把Retrofit和它的Jackson转换器都升级到2.4.0及以上——从Retrofit 2.4.0开始,官方就支持OkHttp 3.9.0+了:
<!-- 升级Retrofit核心包 --> <dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit</artifactId> <version>2.4.0</version> </dependency> <!-- 同步升级Jackson转换器 --> <dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>converter-jackson</artifactId> <version>2.4.0</version> </dependency>
额外兜底方案:强制指定Okio版本
如果上面两个方案都没解决问题,你可以直接显式添加Okio依赖,指定版本为1.13.0(就是OkHttp 3.9.1要求的版本),确保JVM加载正确的Okio:
<dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>1.13.0</version> </dependency>
验证方法
改完依赖后,跑一下mvn dependency:tree命令,看看输出里okio的版本是不是统一的,有没有多个版本共存的情况——如果只有1.13.0(或者和OkHttp匹配的版本),那就没问题了。
内容的提问来源于stack exchange,提问作者Paras

