OpenFeign 接口调用问题及解决方案

发布时间 2023-11-10 08:51:32作者: Binge-和时间做朋友

问题描述

如果在同一个工程中出现两个 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 作为别名。