项目场景:
srping boot2.0.x 升级到2.2.9遇到的启动报错 :
Description:
The bean 'emailDeliveryStatusGateway' 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
问题描述:
1. bean注入情况,采用spring integration 的 @IntegrationComponentScan 注解扫描gateway bean:
@IntegrationComponentScan
public class EmailDeliveryStatusHandleFlowConfig{
@MessagingGateway(name = "emailDeliveryStatusGateway", defaultRequestChannel = EMAIL_DELIVERY_STATUS_CHANNEL)
@Description("发送结果态网关")
@SuppressWarnings("unused")
public interface MailDeliveryStatusNotificationExecutionsListener extends EmailDeliveryStatusGateway {
@Gateway
@Override
void receive(Message<MailDeliveryStatusData> message);
}
}
EmailDeliveryStatusHandleFlowConfig 被其他 config 通过@import 注解引入
- Stack Overflow :https://stackoverflow.com/questions/54059222/the-bean-metadatasourceadvisor-defined-in-null-could-not-be-registered
- boot update note: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes#bean-overriding
原因分析:
通过以上stack overflow 分析可能是 @IntegrationComponentScan 重复扫描引起的,在2.0.x boot 版本没问题,应该是spring.main.allow-bean-definition-overriding=true 为默认配置,而在 2.1.x 版本以上已更新为 false;
解决方案:
1. 设置 spring.main.allow-bean-definition-overriding=true,(治标不治本);
2. 理清 配置依赖,杜绝 重复扫描(推荐)
其它出现这种情况的包含 feignClien scan,repository scan等场景