dCardAlarmController required a single bean, but 2 were found:

关于后台项目启动报如下错误的解决办法

APPLICATION FAILED TO START

***************************

Description:

Field iSearchServiceImpl in com.sailing.di.controlalarmservice.ws.idcardAlarm.IdCardAlarmController required a single bean, but 2 were found:

  • cloudSearchServiceImpl: defined in file [D:\curretCode\DIPFB\server-control-alarm\target\classes\com\sailing\di\controlalarmservice\model\controlAlarm\service\impl\CloudSearchServiceImpl.class]

  • ICloudSearchService: defined in file [D:\curretCode\DIPFB\server-control-alarm\target\classes\com\sailing\di\controlalarmservice\model\controlAlarm\service\ICloudSearchService.class]

错误分析

根据提示,Controller中没办法自动注入ICloudSearchService。

@Autowired默认按照类型注入,根据提示,我的项目中这个类型的bean有两个,因此无法自动注入。

错误信息也给出了解决的办法:

1.把其中一个bean加上@Primary注解,就可以作为默认使用,

2.在注入的属性添加@Qualifier指定beanName,以明确使用哪一个bean

但我只写了一个接口的实现类,按预期只有一个bean,应该是没问题的。

原因

经过一圈排查,发现我在springboot的启动类上添加了注解@MapperScan("om.gdd.di.*")。

@MapperScan这个是注解是mybatis的Mapper扫描注解,并且我指定的扫描范围是com包。

mybatis扫描com下的接口,生成接口的实现类,注入到spring。

然后spring扫描到我编写的接口实现类,注入spring, 因此就有了两个bean。

解决办法

1.在springboot项目中建议直接在Mapper接口上添加@Mapper,不要使用@MapperScan。

  1. 若要使用@MapperScan注解,注意配置好扫描的范围,避免重复扫描注入spring bean导致出现上述问题。

建议使用第二种方式 指定mapperScan的扫描范围 @MapperScan(value = {"com.gdd.di.controlalarmservice.model.*.repository"})

由原来的 @MapperScan("om.sailing.di.*") 改为 @MapperScan(value = {"com.gdd.di.controlalarmservice.model.*.repository"}) 项目可以正常启动

相关推荐
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草2 小时前
关于SpringMVC的整理
spring
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.3 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥3 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人3 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址