Spring-boot存储库未注册为有效Bean

时间:2018-11-29 22:28:13

标签: spring spring-boot spring-data-jpa spring-data

Spring-boot似乎不想将我的存储库注册为有效的bean :(这是我看到的错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.frustrated.stats.MyRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

根本原因似乎是:

o.s.c.a.ClassPathBeanDefinitionScanner   : Ignored because not a concrete top-level class: file [/Users/me/Code/my_app/my_service/build/classes/java/main/com/frustrated/stats/MyRepository.class]

我是否在某个地方对应用程序进行了不正确的配置?

这是我的文件:

MyRepository.java

package com.frustrated.stats;

@Repository
public interface MyRepository extends JpaRepository<StatsEvent, Long> {}

StatsEvent.java

package com.frustrated.stats;

@Entity
public class StatsEvent { ... }

Application.java

@SpringBootApplication
@ComponentScan(basePackages = { "com.frustrated" })
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@EnableSpringDataWebSupport
public class Application extends SpringBootServletInitializer {

这是我的包裹结构:

com:
  frustrated:
    - Application.java
    stats:
      - MyRepository.java
      - StatsEvent.java

尝试调试

尝试了许多不同的注释后,我认为简单地完成注册过程可能会更有效率。我已经跟踪了代码,但似乎失败了here

    protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
        AnnotationMetadata metadata = beanDefinition.getMetadata();
        return (metadata.isIndependent() && (metadata.isConcrete() ||
            (metadata.isAbstract() && metadata.hasAnnotatedMethods(Lookup.class.getName()))));
}

metadata.hasAnnotatedMethods(Lookup.class.getName())是错误的,导致我的存储库没有被这样实例化。

还可能需要注意的是,我的StatsEvent也被忽略了,因为:

o.s.c.a.ClassPathBeanDefinitionScanner   : Ignored because not matching any filter: file [/Users/me/Code/my_app/my_service/build/classes/java/main/com/frustrated/stats/StatsEvent.class]

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

尝试将其添加到Application.class顶部

@EnableJpaRepositories(basePackages = "com.frustrated.stats.MyRepository")
@ComponentScan("com.frustrated.stats.service") // if you have it
@EntityScan("com.frustrated.stats.entity") // of your entities

答案 1 :(得分:1)

根据MyRepository扩展JpaRepository的判断,您正在尝试使用Spring Data JPA,但是您已经排除了Hibernate和DataSource的自动配置。除非您为Hibernate或未提供的其他JPA提供程序进行了一些手动配置,否则将禁用对JpaRepository的支持,因为它需要JPA提供程序和数据源。