我正在学习弹簧靴。这是我的Spring Boot项目结构。我确实有意将我的application.java放在其他软件包中,以了解@ComponentScan
项目源-https://github.com/kitkars/spring-boot
错误:
The application failed to start due to below error. *************************** APPLICATION FAILED TO START *************************** Description: Field productRepository in com.test.service.ProductService required a bean of type 'com.test.repository.ProductRepository' 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 'com.test.repository.ProductRepository' in your configuration. Process finished with exit code 1
这是我的Application.java
@SpringBootApplication
@ComponentScan(basePackages = "com.test")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
现在,如果我将Application.java
移到com.test
下,一切都会很好。
如果我的Application.java不在com.test
下怎么办-它不能使用ComponentScan
包并从那里开始吗?所有控制器,服务,存储库等都位于com.test
下。
答案 0 :(得分:2)
用@SpringBootApplication
注释的类应该在您的根包中(默认情况下,将扫描此包中的所有类和子包),或者您需要指定其他包(controller
,entity
和其他)在@ComponentScan
中。
官方文档指出:
我们通常建议您将主应用程序类放在其他类之上的根包中。
答案 1 :(得分:0)
Spring Boot严重依赖默认配置。考虑来自@EnableAutoConfiguration
批注的摘录。
带有注释的类的包 @EnableAutoConfiguration(通常通过@SpringBootApplication)具有 具体意义,通常用作“默认值”。例如, 扫描@Entity类时将使用它。一般 建议您放置@EnableAutoConfiguration(如果您不 在根包中使用@SpringBootApplication),以便所有 可以搜索子包和类。
相同的逻辑暗示@ComponentScan
,@EnableJpaRepositories
和上面提到的@EntityScan
注释。因此,如果要控制组件扫描,则应为所有这些注释显式指定基本软件包。
@SpringBootApplication(scanBasePackages = "com.test")
@EnableJpaRepositories(basePackages = "com.test")
@EntityScan(basePackages = "com.test")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
还要注意,在您的情况下,无需使用其他@ComponentScan
,因为您可以通过scanBasePackages属性为Spring Boot的@ComponentScan
提供参数。
答案 2 :(得分:0)
如果有,请检查依赖项'org.springframework:spring-context-indexer
。就我而言,该库导致子模块出现问题。
问题在于索引中仅包含当前gradle项目的bean。
答案 3 :(得分:-1)
You should remove @Repository
in com/test/repository/ProductRepository.java
.