@FeignClient注解中的contextId属性如何使用
导读:本文共2341字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、概述如果我们使用Feign定义了两个接口,但是目标服务是同一个,那么在SpringBoot启动时就会遇到一个问题:Description:The bean 'xxxxxxxx.FeignClientSpecification', defined in null, could not be registered. A bean with tha... ...
目录
(为您整理了一些要点),点击可以直达。一、概述
如果我们使用Feign定义了两个接口,但是目标服务是同一个,那么在SpringBoot启动时就会遇到一个问题:
Description:
The bean 'xxxxxxxx.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
二、解决方案
2.1 方案1
修改yml配置:spring.main.allow-bean-definition-overriding=true
spring:main:allow-bean-definition-overriding:true
2.2 方案2
在每个Feign的接口中,在注解上加 contextId属性
contextId在Feign Client的作用是在注册Feign Client Configuration的时候需要一个名称,名称是通过getClientName方法获取的
@FeignClient(name="sale-service",contextId="saleservice1")publicinterfacesaleClient{@RequestMapping(value="/sale/add",method=RequestMethod.GET)Stringadd(@RequestParam("saleNum")StringqueryStr);}
备注:contextId= "名称" 中的名称,不能用“_”会报错,可以用“-”
三、源代码分析
包名:spring-cloud-openfeign-core-2.2.5.RELEASE.jar
类路径:org.springframework.cloud.openfeign.FeignClientsRegistrar
相关代码1
privatevoidregisterFeignClient(BeanDefinitionRegistryregistry,AnnotationMetadataannotationMetadata,Map<String,Object>attributes){StringclassName=annotationMetadata.getClassName();BeanDefinitionBuilderdefinition=BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);this.validate(attributes);definition.addPropertyValue("url",this.getUrl(attributes));definition.addPropertyValue("path",this.getPath(attributes));Stringname=this.getName(attributes);definition.addPropertyValue("name",name);StringcontextId=this.getContextId(attributes);definition.addPropertyValue("contextId",contextId);definition.addPropertyValue("type",className);definition.addPropertyValue("decode404",attributes.get("decode404"));definition.addPropertyValue("fallback",attributes.get("fallback"));definition.addPropertyValue("fallbackFactory",attributes.get("fallbackFactory"));definition.setAutowireMode(2);Stringalias=contextId+"FeignClient";AbstractBeanDefinitionbeanDefinition=definition.getBeanDefinition();beanDefinition.setAttribute("factoryBeanObjectType",className);booleanprimary=(Boolean)attributes.get("primary");beanDefinition.setPrimary(primary);Stringqualifier=this.getQualifier(attributes);if(StringUtils.hasText(qualifier)){alias=qualifier;}BeanDefinitionHolderholder=newBeanDefinitionHolder(beanDefinition,className,newString[]{alias});BeanDefinitionReaderUtils.registerBeanDefinition(holder,registry);}
代码截图:
相关代码2
可以看到,name应该是从注解中的属性取值来的, 再看看getClientName()方法.
privateStringgetClientName(Map<String,Object>client){if(client==null){returnnull;}else{Stringvalue=(String)client.get("contextId");if(!StringUtils.hasText(value)){value=(String)client.get("value");}if(!StringUtils.hasText(value)){value=(String)client.get("name");}if(!StringUtils.hasText(value)){value=(String)client.get("serviceId");}if(StringUtils.hasText(value)){returnvalue;}else{thrownewIllegalStateException("Either'name'or'value'mustbeprovidedin@"+FeignClient.class.getSimpleName());}}}
代码截图:
一目了然了, 我们声明@FeignClient注解时, 只使用了value属性, 所以产生了冲突, 只要加上contextId就好了.
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
@FeignClient注解中的contextId属性如何使用的详细内容,希望对您有所帮助,信息来源于网络。