在学习springcloud时,因为之前教程运行过eureka注册中心,当学到使用nacos作为注册中心时,出现了问题,我启动了两个服务提供者,第一个能正常运行,但是第二个则报了错误,并且代码都是没错的,报错信息如下:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field autoServiceRegistration in org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration required a single bean, but 2 were found:
- nacosAutoServiceRegistration: defined by method 'nacosAutoServiceRegistration' in class path resource [com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.class]
- eurekaAutoServiceRegistration: defined by method 'eurekaAutoServiceRegistration' in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
经过我查了一些大佬写的博客,发现原因是 AutoServiceRegistrationAutoConfiguration 这个类需要自动注入一个类型为AutoServiceRegistration 的 bean。但是在 Spring 容器中,发现了两个父类为 AutoServiceRegistration 的 bean,分别是nacosAutoServiceRegistration 和 eurekaAutoServiceRegistration。这样就导致了自动注入时不知道应该选择使用哪个 bean,进而导致了应用启动失败。
于是你可以给一个bean加上注解@Primary,但我这好像没有啊,找不到,搜索找到的Bean是只读文档,我改不了,后来我发现,只有其中一个模块会出现这样的错误,我就去这个模块中找问题,最终发现是这个模块eureka坐标没注释,看来是nacos和eureka的两个坐标同时存在,所以Spring会不知道注入谁,然后我注释eureka的坐标之后再运行,发现仍旧报错,索性执行clean清除一下坐标,再启动,成功运行!
歪打正着,也算是幸运了= =