Skip to content

Sentinel 和 Feign 集成时,方法名称写错 #1345

Closed
@dsaewq321

Description

@dsaewq321

版本:spring-cloud-alibaba-2.1.0.RELEASE

Sentinel 和 Feign 集成时,方法名称写错,有如下接口:
List<MethodMetadata> feign.Contract.parseAndValidateMetadata(Class<?> targetType);

在 spring-cloud-alibaba-sentinel-2.1.0.RELEASE.jar 中,实现了上述方法,不过方法名却写错了,导致目前无法使用,实现方法如下:
List<MethodMetadata> com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata(Class<?> targetType);

Activity

sczyh30

sczyh30 commented on Mar 18, 2020

@sczyh30
Member

Could you please provide the detailed error message?

carCV

carCV commented on Mar 18, 2020

@carCV

当我在集成 Sentinel 和 Feign 时,运行github上的示例代码,代码地址如下:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/controller/TestController.java

遇到了类似于上述的问题,具体问题日志如下:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'echoController': Unsatisfied dependency expressed through field 'echoService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.jmlee.hello.sentinel.feign.service.EchoService': FactoryBean threw exception on object creation; nested exception is java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidateMetadata(Ljava/lang/Class;)Ljava/util/List;

所用版本:

Spring Cloud Version:Hoxton.SR3
Spring Cloud Alibaba Version:2.2.0.RELEASE

sczyh30

sczyh30 commented on Mar 18, 2020

@sczyh30
Member

@fangjian0423 Could you please take a look?

herodotus-ecosystem

herodotus-ecosystem commented on Mar 20, 2020

@herodotus-ecosystem

Hoxton.SR1 中,fegin.context接口的定义为parseAndValidatateMetadata
Hoxton.SR3 中,fegin.context接口的定义为parseAndValidateMetadata。就是之前版本中定义的方法名拼写错误,所以在Hoxton.SR1后面的版本更正过来,所以出现Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidateMetadata(Ljava/lang/Class;)Ljava/util/List;错误。

我目前的解决办法是:在工程合适的地方,新建包com.alibaba.cloud.sentinel.feign。重新修改一下SentinelContractHolder即可

`
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> parseAndValidateMetadata(Class<?> targetType) {
	List<MethodMetadata> metadatas = delegate.parseAndValidateMetadata(targetType);
	metadatas.forEach(metadata -> METADATA_MAP
			.put(targetType.getName() + metadata.configKey(), metadata));
	return metadatas;
}

}
`

cdfive

cdfive commented on Mar 20, 2020

@cdfive
Collaborator

By reproducing it, I found two ways to solve this:

  1. Change Spring Cloud Version from Hoxton.SR3 to Hoxton.RELEASE

  2. Remain using Hoxton.SR3, and specified the version of spring-cloud-openfeign-dependencies to 2.2.0.RELEASE.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Note that the spring-cloud-openfeign-dependencies should be in front of spring-cloud-dependencies.

The reason is as @pointerv described.

dsaewq321

dsaewq321 commented on Mar 21, 2020

@dsaewq321
Author
dsaewq321

dsaewq321 commented on Mar 21, 2020

@dsaewq321
Author
fanqisoft

fanqisoft commented on Mar 24, 2020

@fanqisoft

碰到了相同的问题,谢谢

stalary

stalary commented on Mar 24, 2020

@stalary

碰到了同样的问题,多谢

fangjian0423

fangjian0423 commented on Mar 25, 2020

@fangjian0423
Contributor

Spring Cloud Alibaba 2.2.0.RELEASE based on Hoxton.RELEASE.

Spring Cloud Alibaba 2.2.1.RELEASE based on Hoxton.SR3 and it's going to release soon.

sczyh30

sczyh30 commented on Apr 17, 2020

@sczyh30
Member

Closing this issue as SCA 2.2.1.RELEASE has been released. Thanks all :)

MemoryF

MemoryF commented on May 13, 2020

@MemoryF

Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata(Ljava/lang/Class;)Ljava/util/List;
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:154) ~[feign-core-10.4.0.jar:na]
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:52) ~[feign-core-10.4.0.jar:na]
at feign.Feign$Builder.target(Feign.java:251) ~[feign-core-10.4.0.jar:na]
at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:243) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:272) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:252) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
... 48 common frames omitted

Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidatateMetadata(Ljava/lang/Class;)Ljava/util/List;
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:154) ~[feign-core-10.4.0.jar:na]
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:52) ~[feign-core-10.4.0.jar:na]
at feign.Feign$Builder.target(Feign.java:251) ~[feign-core-10.4.0.jar:na]
at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:243) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:272) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:252) ~[spring-cloud-openfeign-core-2.2.1.RELEASE.jar:2.2.1.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
... 48 common frames omitted

MemoryF

MemoryF commented on May 13, 2020

@MemoryF

2.2.1.RELEASE Hoxton.SR3 可以适配了。但是要去中央仓库下载Hoxton.SR3 阿里云仓库还没有

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    integration/spring-cloudIssue related to Spring Cloud Alibaba integration

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @fangjian0423@sczyh30@herodotus-ecosystem@stalary@MemoryF

        Issue actions

          Sentinel 和 Feign 集成时,方法名称写错 · Issue #1345 · alibaba/Sentinel