一、前言

近来开发经常遇到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的问题。这一点将会在以后的博文中详细描述。

几种情况总结完毕,望对各位网友有帮助。