我正在尝试创建项目结构,允许我通过简单地在类路径上添加/删除模块。在我的Spring应用程序中使用@ComponentScan("com.companyname")
注释,它可以从模块中检测并创建带注释的组件。但是当我尝试在任何地方自动装载我的CrudRepository时,我会遇到错误:
Field repo in com.companyname.somemodule.services.SomeService required a bean of type 'com.companyname.somemodule.repos.SomeRepo' that could not be found.
所以我认为,如果它们在一个模块中定义,它可能以某种方式无法创建回购,所以我没有提前并将测试回购添加到我的基础SpringApplication中,令我惊讶的是我得到了:
Field repo in com.companyname.modularapp.TestService required a bean of type 'com.companyname.modularapp.TestRepo' that could not be found.
然后我刚删除了我的@ComponentScan
注释,突然TestRepo按照我的意图工作,我能够坚持并正常阅读测试实体。因此,显然ComponentScan会以某种方式搞砸CrudRepository的创建,或者稍后检测它。
我像这样定义我的回购:
@Entity
public class Test {
@Id
private long id;
}
public interface TestRepo extends CrudRepository<Test, Long>{}
我正在尝试使用这个项目的Spring Boot 2.0.0.M7,但我怀疑这是原因。 我错过了什么吗?
答案 0 :(得分:2)
您还可以通过以下方式定义存储库扫描包:
@EnableJpaRepositories("com.companyname")
或在XML配置中
<jpa:repositories base-package="com.companyname"/>
答案 1 :(得分:0)
如果您使用的是spring-boot,您可以删除@ComponentScan注释,因为@SpringBootApplication注释中已经定义了注释。也许他们之间存在某种冲突,如果不看代码就很难说清楚。
答案 2 :(得分:0)
如果您在项目中自定义程序包扫描,那么您可能需要手动配置需要扫描路径的bean,例如:对于JPA,您可以创建自己的LocalContainerEntityManagerFactoryBean
bean(您可以在此处找到自动配置示例 -
org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration#entityManagerFactory
- 来自spring-boot 1.5。*)的类链接。
但是,如果您不需要包扫描自定义,只需在项目根目录中使用@SpringBootApplication注释类,并将其传递给spring :: run方法。