The bean ‘xxx.FeignClientSpecification‘ could not be registered. A bean with that name has already b

文章讲述了在SpringCloud中遇到的FeignClientbean注册异常,原因是多个接口使用了相同的@FeignClient注解调用同一服务。提供了三种解决方案:合并接口、启用bean覆盖或设置不同的contextId。第三种方案通过设置不同的contextId避免了bean冲突。
摘要由CSDN通过智能技术生成

一、异常日志:

The bean 'xxxx.FeignClientSpecification' could not be registered. A bean with that name has already been defined and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

二、原因:
在同于一个微服务中多个feign接口使用@FeignClient注解调用同一个名称的微服务,启动时引发的异常
比如:项目中定义了两个feign接口类,但是注解都是@FeignClient(value = "userinfo-service")为此报错了。

@Component
@FeignClient(value = "base-log")
public interface LogReqFeign {

    @PostMapping("/v1/base/log/req")
    ResObj postObj(@RequestBody ReqObj<LogReq> reqObj);

    @GetMapping("/v1/base/log/req")
    ResObj getObj(Map<String, Object> map);

    @GetMapping("/v1/base/log/req/{id}")
    ResObj getObjById(@PathVariable("id") Long id);
    
}
@Component
@FeignClient(value = "base-log")
public interface LogEventFeign {

    @PostMapping("/v1/base/log/event")
    ResObj postObj(@RequestBody ReqObj<LogEvent> reqObj);

    @GetMapping("/v1/base/log/event")
    ResObj getObj(Map<String, Object> map);

    @GetMapping("/v1/base/log/event/{id}")
    ResObj getObjById(@PathVariable("id") Long id);
}


三、解决方案:
1、方案一:
将调用同一个服务的fegin接口都写到一个LogReqFeign接口类中。但是我这里不合适,我远程调用的方法都是同名的
2、方案二:
配置文件中添加配置:

spring:
   main:
      allow-bean-definition-overriding: true

通过设置spring.main.allow-bean-definition-overriding=true来允许bean覆盖,但是这种方式并不推荐,因为可能会导致意外的覆盖,导致应用程序出现其他问题。

3、方案三:

@FeignClient增加contextId属性,改为

@FeignClient(name = "xxx", path = API.PATH,contextId="xxx1")
@FeignClient(name = "xxx", path = API.PATH,contextId="xxx2")
@Component
@FeignClient(value = "base-log",contextId = "LogEvent")
public interface LogEventFeign {

    @PostMapping("/v1/base/log/event")
    ResObj postObj(@RequestBody ReqObj<LogEvent> reqObj);

    @GetMapping("/v1/base/log/event")
    ResObj getObj(Map<String, Object> map);

    @GetMapping("/v1/base/log/event/{id}")
    ResObj getObjById(@PathVariable("id") Long id);
}
@Component
@FeignClient(value = "base-log",contextId = "LogReq")
public interface LogReqFeign {

    @PostMapping("/v1/base/log/req")
    ResObj postObj(@RequestBody ReqObj<LogReq> reqObj);

    @GetMapping("/v1/base/log/req")
    ResObj getObj(Map<String, Object> map);

    @GetMapping("/v1/base/log/req/{id}")
    ResObj getObjById(@PathVariable("id") Long id);

}

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值