3

我在与配置类不同的包中有一个存储库,因此我使用@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 就足够了


更新

由于一些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至无需对“test”进行组件扫描即可工作:

SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}

现在的问题是为什么当它不起作用时我什至需要在 @Repository 上使用组件扫描?为什么在文档中 @Repository 被组件扫描扫描时它没有效果并且@EnableJpaRepostiories 是enoguh?

来自关于组件扫描的 Spring 文档:指示是否应启用对使用 @Component @Repository、@Service 或 @Controller 注释的类的自动检测。

在我的情况下,@Repository 未被检测到

4

3 回答 3

7

为了让 spring 知道什么 DataSource 与什么 Repository 相关,您应该在@EnableJpaRepositories注释中定义它。

尝试启用如下所示的 jpa 存储库。

@SpringBootApplication
@ComponentScan({"test","com.app"})
@EnableJpaRepositories("test")
public class Application extends SpringBootServletInitializer {
}

更新:为什么需要@EnableJpaRepositories?

@SpringBootApplication 自动提供以下注解的特性

@Configuration @EnableAutoConfiguration @ComponentScan

但是如果您尝试定义自己的注释,那么 Spring Boot 将不会处理内部自动配置,因此这就是我们必须启用存储库的原因。

如果您不编写自己的东西,我有一些项目,其中只有 @SpringBootApplication 就足够了。

我希望你明白了。

金字:

如果你想最大限度地利用spring boot的自动配置特性,最好将你所有的类包放在spring boot主应用包下(直接放在主包中或间接作为子包)。

于 2018-11-06T13:03:21.880 回答
1

我找到了关于我做错了什么的解释。带有componentscan的@Repository注解不会导致spring实现spring jpa存储库。对于实现 crud 存储库的接口,应使用 enablejparepository。

现在使用 @Repository 和 componentsscan 是当你有一个存储库类并且你有自己的 DAO而不是 spring curd repo否则将不会创建实现:

@Repository
public class UserTest {


    public List<Object> findById(long l) {

             .......
    }
}
于 2018-11-06T13:49:39.247 回答
0

您应该使用如下代码,因为 @ComponentScan 始终与 basepackages 一起使用,因此您的实现应该如下所示。

 package com.app;
    @SpringBootApplication
    @ComponentScan(basePackages={"test","com.app"})
    @EnableJPARepositories 
    public class Application extends SpringBootServletInitializer {
    }
于 2018-11-06T12:58:42.640 回答