最近在创建一个多module的springnoot项目时,发现项目启动一直扫描不到@Repository注释的类。
报错如下:
Description:
Field helloService in com.example.demo.service.TestService required a bean of type 'com.example.test.modules1.service.repository.HelloRepository' that could not be found.
Action:
Consider defining a bean of type 'com.example.test.modules1.service.repository.HelloRepository' in your configuration.
意思是spingboot没有将HelloRepository加载到spring Ioc中,导致其他地方使用@Autowired无法congspring Ioc中得到HelloRepository并注入TestService 中。
我的启动类中已经包含了@SpringBootApplication(scanBasePackages={"com.example.test.modules1"})。接口中也加入了注解@Repository。
找了好久才发现是我的启动类的原因。
先将一下我的项目module组成。一共有两个模块,一共而启动模块(start),一个是业务模块(module1),所有的木块的包总路径都是com.example.test。问题就出现在我的项目启动类TestApplication上。我的TestApplication的路径是com.example.test.start.TestApplication这样就会导致项目扫描不到com.example.test.module1下面的@Repository的接口。
原因是 在使用Spring-data-jpa
时,通常都是继承Repository
接口相关的其他接口,然后Spring-data-jpa
在项目启动时,会为所有继承了Repository
的接口(@NoRepositoryBean
修饰除外)创建实现类,并交由Spring
管理。当启项目动类代码Application
处于HelloRepository、
TestService
的根目录中,所以HelloRepository
是可以被成功注入到TestService
中的。但是 如果将Application移动到其他平行目录或者子目录,就算使用scanBasePackages指定扫描目录也无法将HelloRepository
成功注入,会产生如下错误描述:
Action:
Consider defining a bean of type 'com.example.test.modules1.service.repository.HelloRepository' in your configuration.
解决办法就是将启动类TestApplication,建立在根目录(com.example.test)之下。