问题
项目中原来使用的是 Dubbo 和 OkHttp。最近一个需求涉及到大量的 HTTP 调用,于是就用 Feign,由于 Dubbo 中本身已经添加了相应的依赖,直接把 Feign 打开即可。
没想到应用没启动起来:
直接打开DubboTransportedMethodMetadataResolver
找到对应行:
Contract
是 Feign 的一个接口,而 Contract
中并没有 parseAndValidateMetadata
方法,而是 parseAndValidatateMetadata
看起来像是 Feign 里的方法名拼写错了(validate → validatate)
解决方案
这个问题解决方法有两个:
升级依赖包
在 GitHub 上找到
Contract
方法名更正的时间点可以看到是2019年10月22日
在 maven repository 里查看 feign-core 的版本及对应的时间
离修改时间最近的一个版本是
10.6.0
在项目中将
10.4.0
的包 exclude掉,然后再添加10.6.0
的包即可
二、重写Resolver类
有些项目贸然升级包会引起一系列的连锁反应,如果是这样的话,可以试试第二种文案:
在项目里建一个 com.alibaba.cloud.dubbo.metadata.resolver
的包,然后把 DubboTransportedMethodMetadataResolver
这个类拷到这个包下
最后在该类中将对应的方法名替换掉
这种也非常简单,只是在项目代码里多了一个额外的包名看上去不是那么优雅
后记
问题解决了,但是原因呢?为什么项目中会引入 feign-core-10.4.0
这个有问题的包呢?
项目里使用的是 spring-cloud-starter-dubbo-2.2.1.RELEASE , 这包依赖 spring-cloud-openfeign-core-2.2.2.RELEASE , 这个包里声明的 feign-core 的版本是 10.7.4
, 说明 Dubbo 的包没有问题
问题在于项目中还使用了 spring-cloud-openfeign-dependencies-2.2.1.RELEASE
这里指定了版本 10.4.0
(完)