@FeignClient注解中的contextId属性如何使用(@feignclient,contextid,开发技术)

时间:2024-05-03 11:22:32 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一、概述

如果我们使用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);}

代码截图:

@FeignClient注解中的contextId属性如何使用

相关代码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注解中的contextId属性如何使用

一目了然了, 我们声明@FeignClient注解时, 只使用了value属性, 所以产生了冲突, 只要加上contextId就好了.

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:@FeignClient注解中的contextId属性如何使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Java的Cookie、Session及kaptcha验证码如何使用下一篇:

9 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18