报错提示
Description:
The bean 'xxx', 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
报错原因:
当我们使用@FeignClient注解时,
比如我们有个admin服务,但admin服务中有很多个接口,我们不想将所有的调用接口都定义在一个类中,
举例代码:
Client 1
@FeignClient(name = "admin")
public interface AdminRemoteClient {
@GetMapping("/admin/get")
public Admin getAdmin(@RequestParam("id") int id);
}
Client 2
@FeignClient(name = "admin")
public interface AdminRemoteClient2 {
@GetMapping("/admin2/get")
public Admin getAdmin(@RequestParam("id") int id);
}
这个时候启动项目就会报错,因为bean名称起冲突了
解决方法
解决方案可以增加下面的配置,作用是允许出现beanName一样的BeanDefinition。
spring.main.allow-bean-definition-overriding=true
另一种解决方案就是为每个Client手动指定不同的contextId,这样就不会冲突了。
上面给出了Bean名称冲突后的解决方案,下面来分析下contextId在Feign Client的作用,在注册Feign Client Configuration的时候需要一个名称,名称是通过getClientName方法获取的
如:
@FeignClient(name = "admin",contextId="admin1" )