我的存储库与配置类不同,因此我用@Repostiory对其进行了以下注释:
package test;
@Repository
public interface UserTest extends JpaRepository<User, Long> {
}
我已经对其进行了组件扫描,但是没有用:
package com.app;
@SpringBootApplication
@ComponentScan({"test","com.app"})
public class Application extends SpringBootServletInitializer {
}
异常:没有可用的'test.UserTest'类型的合格Bean:预期至少有1个有资格作为自动装配候选的Bean。
为什么除非添加enableJpaRepositories,否则组件扫描对存储库不起作用?我以为componetScan够了
更新:
由于某些答案提供了解决方案,因此我要求提供的解释不是解决方案。甚至无需在“测试”上进行组件扫描即可执行以下操作:
SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}
现在的问题是,为什么当我无法使用@Repository时我什至需要使用componentscan?为什么在文档中@Repository不起作用并且@EnableJpaRepostiories是enoguh时被组件扫描?
从Spring文档中有关组件扫描的内容: 指示是否应启用对以@Component @ Repository,@ Service或@Controller注释的类的自动检测。
在我的情况下,未检测到@Repository
答案 0 :(得分:1)
为了让spring知道哪些DataSource与哪些Repository相关,您应该在@EnableJpaRepositories
批注中对其进行定义。
尝试启用如下所示的jpa存储库。
@SpringBootApplication
@ComponentScan({"test","com.app"})
@EnableJpaRepositories("test")
public class Application extends SpringBootServletInitializer {
}
更新:为什么需要@EnableJpaRepositories?
@SpringBootApplication自动提供以下注释的功能
@配置 @EnableAutoConfiguration @ComponentScan
但是,如果您尝试定义自己的注释,那么spring boot不会处理内部自动配置,因此这就是我们必须启用存储库的原因。
我有一些项目,如果您不编写自己的东西,那么仅@SpringBootApplication就足够了。
我希望你明白了。
金字:
如果您想最大程度地利用spring boot的自动配置功能,可以将所有类包都放在spring boot主应用程序包下(直接放在主包中或间接作为子包)。
。答案 1 :(得分:1)
我找到了关于我做错事情的解释。具有组件的@Repository批注不会导致spring实施spring jpa存储库。应当使用实现crud仓库的接口enablejparepository。
现在,当您拥有一个存储库类并且拥有自己的DAO时,将@Repository与componentscan一起使用不适用于spring curd repo ,否则将不会创建实现:
@Repository
public class UserTest {
public List<Object> findById(long l) {
.......
}
}
答案 2 :(得分:0)
您应该像下面那样使用您的代码,因为@ComponentScan始终与基本软件包一起使用,因此您的实现应如下所示。
package com.app;
@SpringBootApplication
@ComponentScan(basePackages={"test","com.app"})
@EnableJPARepositories
public class Application extends SpringBootServletInitializer {
}