出现org.springframework.beans.factory.annotation.Autowired的问题总结
一、前言
近来开发经常遇到could not be found
的问题,这是一个新手经常能够碰到的问题,其经典的日志如下:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field pkDeviceRemoteService in cn.xxx.parkagent.controller.ParkingController required a bean of type 'cn.xxx.parklib.serviceApi.PkDeviceRemoteService' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'cn.xxx.parklib.serviceApi.PkDeviceRemoteService' in your configuration.
这段报错信息很容易理解,意味着在Bean池中找不到相应的注入类就会报此错。由于我们日常研发中经常遇到这个错误,所以此文将会对各种可能出现此错误的情形进行总结,以便各位查阅。
二、情形一
上文的日志显示,我们在Controller中无法找到Service 类,一般这种情况会出现在@Service没有标注到具体实现类上。如果出现Service找不到,不妨是否已经在@Service上标注。
三、情形二
如果是一个Dao类或者Mapper类没办法找到,则认为没有标注@Mapper标志在指定的类上。
四、情形三
如果以上注解检查完毕后都没有发现问题,那么问题出现在ComponentScan的目录上。一般来说,spring会默认扫描(scan)Application所在目录的下一级目录下,如果所需要加载的类不在该目录下,则spring无法加载到Bean池。
这种情形一般出现在引入第三方的lib包中,因为第三方的lib包路径一般不会和当前服务器的路径一致,所以并不会默认加载,需要使用@ComponentScan 显式声明需要扫描的目录。
值得注意的是,引入@ComponentScan需要手动将自己的包路径添加到扫描路径中,否则将会出现访问Controller发生404的问题。这一点将会在以后的博文中详细描述。
几种情况总结完毕,望对各位网友有帮助。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。