概述
SpringCloud Alibaba Sentinel整合SpringCloud OpenFeign,启动报错
FactoryBean threw exception on object creation; nested exception is java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata(Ljava/lang/Class;)Ljava/util/List;
报错原因:
Sentinel框架SentinelContractHolder类中找不到parseAndValidatateMetadata
这个方法,是因为这个方法拼写有错误,在Sentinel和OpenFeign新版本中已经修正为parseAndValidateMetadata
版本 | 方法名 |
---|---|
< 2.2.1.RELEASE | parseAndValidatateMetadata |
>= 2.2.2.RELEASE | parseAndValidateMetadata |
Sentinel(2.2.1.RELEASE)中的SentinelContractHolder
类调用的是新版本的OpenFeign(2.2.2.RELEASE)方法
而Spring Cloud Alibaba(2.2.1.RELEASE)引入的是旧版本的OpenFeign(2.2.1.RELEASE)方法
解决方法
- 解决版本差异问题
- 覆盖SentinelContractHolder类,使其继续调用旧版parseAndValidatateMetadata方法
在项目模块中新建包:com.alibaba.cloud.sentinel.feign
然后添加如下类:package com.alibaba.cloud.sentinel.feign; import feign.Contract; import feign.MethodMetadata; import java.util.HashMap; import java.util.List; import java.util.Map; public class SentinelContractHolder implements Contract { private final Contract delegate; /** * map key is constructed by ClassFullName + configKey. configKey is constructed by {@link * feign.Feign#configKey} */ public final static Map<String, MethodMetadata> METADATA_MAP = new HashMap<>(); public SentinelContractHolder(Contract delegate) { this.delegate = delegate; } @Override public List<MethodMetadata> parseAndValidatateMetadata(Class<?> targetType) { List<MethodMetadata> metadatas = delegate.parseAndValidatateMetadata(targetType); metadatas.forEach(metadata -> METADATA_MAP .put(targetType.getName() + metadata.configKey(), metadata)); return metadatas; } }
推荐使用第二种方法,maven依赖一直是一个复杂的问题,轻易不要变动版本,否则可能牵一发而动全身,带来无法预料的潜在影响。
最后
以上就是精明煎饼为你收集整理的抽象方法错误:com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata解决办法的全部内容,希望文章能够帮你解决抽象方法错误:com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata解决办法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复