springcloud
@FeignClient(contextId = “remoteDataScopeService”)的启动报错
错误提示消息是说remoteDataScopeService的bean定义了2次
根据异常的调用栈 这个调用栈我是在这找到的 https://blog.ahao.moe/posts/Repeated_FeignClientSpecification_of_Feign.html
FeignClientsRegistrar
private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,
Object configuration) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(FeignClientSpecification.class);
builder.addConstructorArgValue(name);
builder.addConstructorArgValue(configuration);
registry.registerBeanDefinition(
name + "." + FeignClientSpecification.class.getSimpleName(),
builder.getBeanDefinition());
}
在上面我发现name重复了,所以往前一步
String name = getClientName(attributes);
registerClientConfiguration(registry, name,
attributes.get("configuration"));
再往前找到name的出处
org.springframework.cloud.openfeign.FeignClientsRegistrar#getClientName
//这个方法一开始看不懂,里面我想不通为何要一直重复,然后想想才发现方法挺有趣的
这个方法在往前一步就是
Map<String, Object> attributes = annotationMetadata
.getAnnotationAttributes(
FeignClient.class.getCanonicalName());
https://blog.csdn.net/zq1994520/article/details/78942684 里面是getCanonicalName方法的解释
然后用idea的Evaluate功能计算attribute.values发现里面就存在着重复的“remoteDataScopeService” 等同于attributes.get(“contextId”)
因为这里的attributates是通过FeignClient(annotationMetadata.getAnnotationTypes()=FeignClient)得到的,所以点进去这个类
里面就看到了正好有12个字段,包含了contextId ,,也随便测试了下发现符合的(但其实我一开始是找的是注解,没想过注解里面的属性)
annotationMetadata.getAnnotationAttributes("org.springframework.cloud.openfeign.FeignClient")
通过计算得到里面的0就是contextId-》remoteDataScopeService
这里突然发现RemoteData是个类??????
然后点进去发现是同事创建的<