2025-01-17 12:01:25.261 WARN 16472 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.example.demo.DemoApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'saleController' for bean class [com.example.demo.controller.SaleController] conflicts with existing, non-compatible bean definition of same name and class [com.example.demo.config.SaleController]
问题原因:
- Spring 在启动时会扫描到两个不同的类
SaleController
,但这两个类都使用了默认的 Bean 名称saleController
(因为类名的首字母会被转换成小写作为 Bean 名)。 - 这导致 Spring 容器无法决定使用哪个类作为
saleController
的 Bean,从而抛出了ConflictingBeanDefinitionException
异常。
解决方案:
-
重命名其中一个
SaleController
类: 如果这两个类的作用不同,应该为它们分别定义不同的 Bean 名称。你可以在其中一个SaleController
类上显式指定一个不同的 Bean 名称来避免冲突。 -
去掉不必要的
@Component
注解: 如果其中一个类是不需要作为 Spring Bean 被管理的,你可以去掉不需要的@Component
注解,或者将其替换为其他注解,来避免被 Spring 扫描到。 -
使用不同的包名或不同的类名: 如果这两个类的功能非常不同,考虑将它们放到不同的包中,或者重命名其中之一,避免冲突。
步骤:
- 打开
com.example.demo.controller.SaleController
和com.example.demo.config.SaleController
这两个类。 - 根据需要修改其中一个类的
@Component
注解,或者修改其名称,确保它们不会使用相同的 Bean 名称。 - 重新启动你的应用。
通过这种方式,你应该能够解决 Bean 名称冲突的问题。