Spring无法找到JpaRepository

时间:2014-05-05 15:37:50

标签: java spring spring-data spring-boot spring-java-config

使用JavaConfig我在查找@Repository Spring bean时遇到问题。

存储库接口的定义如下:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByUsername(String username);

}

配置定义如下:

@Configuration
@ComponentScan("com.example")
@EnableAutoConfiguration
@EnableJpaRepositories("com.example")
public class SampleApplication extends SpringBootServletInitializer {
...

包结构如下所示:

com.example
     configuration
           SampleApplication
     repository
           UserRepository

在日志文件中,我看到存储库找到作为bean定义的候选者,但是:

ClassPathBeanDefinitionScanner | Ignored because not a concrete top-level class:

有趣的事实

如果我将SampleApplication类移动到com.example包,一切都会开始工作。

我缺少什么想法?

4 个答案:

答案 0 :(得分:11)

如果您的JPA实体不在@EntityScan的子包中,则可能需要使用Spring Boot的com.example.configuration注释。我还建议您将@Configuration移出SpringBootServletInitializer并进入自己的班级。

如果您可以将配置类上移到某个级别,则可以将@ComponentScan@EnableJpaRepositories@EntityScan注释全部放在一起(请参阅http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-locating-the-main-class

如果@EntityScan无法解决问题,或许您可以提供一个我们可以查看的示例项目?

答案 1 :(得分:2)

当开始检查@EnableJpaRepositories("com.example")作为基础包时,问题听到使用com.example您的上下文但它不会继续。换句话说,包扫描将在com.example级别停止。为了更深层次的准备,你必须做这样的事情@EnableJpaRepositories("com.example.**")。但是在这种情况下,Spring数据会检查所有包com.example和所有子包。一个更正确的approch应该像这样@EnableJpaRepositories("com.example.repository")@EnableJpaRepositories("com.example.repository.**")。在第一种情况下,您扫描存储库基本包,在第二种情况下,您扫描存储库和存储库的所有子包,在我看来是这种情况下的正确approch。

我希望这可以帮到你

答案 2 :(得分:0)

我通常认为您在@EnableJpaRepositories中指定的包也会遍历内部包。

如果有疑问,您可以尝试使用类型安全替代方案:

@Configuration
@ComponentScan("com.example")
@EnableAutoConfiguration
@EnableJpaRepositories (basePackageClasses = {UserRepository.class})
public class SampleApplication extends SpringBootServletInitializer {
...

答案 3 :(得分:0)

 @EnableJpaRepositories (basePackageClasses = {SchedulerRepository.class})

在我的情况下为我工作,尽管我添加了所有注释以选择存储库