OpenFeign 接口调用问题及解决方案
问题描述
如果在同一个工程中出现两个 OpenFeign 接口使用一样的服务名称会报以下错误:
Description:
The bean 'optimization-user.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
原因分析
原因是 FeignCilent 注解注入到容器中底层源码默认首先使用的是属性 value 的值作为 bean 的名称注入到Spring容器中,两个相同名字注入到 SpringIoC 容器中导致重复注入。
解决方案
方式一
在配置文件中加入下面的配置,作用是允许出现beanName一样的BeanDefinition,可以解决一种报错问题。
spring.main.allow-bean-definition-overriding=true
方式二
每一个 Client 手动指定不同的 ContextId
通过阅读源码可以知道,如果配置了contextId 这个属性,就会采用 contextId 作为 bean 的名称注入进容器中,如果没有配置就会去找value 然后是 name,最后是 serviceId(此属性已经废弃)
@FeignClient(value = "stock-service",contextId = "StockClientFeignEx")
另外在注册 FeignClient 中,这个属性还会作为 Client 别名的一部分,如果配置了 qualifier,会有限使用 qualifier 作为别名。