【问题标题】:Sprint Boot Data JPA: No qualifying bean of type 'java.util.Set<javax.persistence.EntityManager>' availableSprint 引导数据 JPA:没有可用的“java.util.Set<javax.persistence.EntityManager>”类型的合格 bean
【发布时间】:2017-07-15 12:46:45
【问题描述】:

我无法开始使用spring-boot-starter-data-jpa。我在this guide 之后创建了一个简单的 Spring Boot 应用程序,但使用了 Hibernate 和相关配置。

build.gradle:

dependencies {
    // Spring stuff
    compile 'org.springframework.boot:spring-boot-starter-data-jpa:1.5.1.RELEASE'
    compile 'org.springframework.data:spring-data-jpa'
    compile 'org.springframework:spring-webmvc'
    // Jackson
    compile 'com.fasterxml.jackson.core:jackson-databind:+'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:+'
    // Postgres
    compile 'org.postgresql:postgresql:+'
    // Hibernate
    compile 'org.hibernate:hibernate-core:5.2.8.Final'
}

每当我尝试运行应用程序时,都会得到以下结果:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-02-24 16:20:27.710 ERROR 1070 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jpaContext': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.Set<javax.persistence.EntityManager>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
    at nl.eonics.cdaas.service.Application.main(Application.java:14) [main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) [idea_rt.jar:na]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.Set<javax.persistence.EntityManager>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    ... 23 common frames omitted

我见过this bug(据报道在 1.10.7 中已修复),但将spring-data-jpa 降级到 1.9.x 并没有帮助,我仍然遇到同样的错误。

有什么想法吗?

【问题讨论】:

  • 如果你使用 'org.springframework.boot:spring-boot-starter-data-jpa:1.5.1.RELEASE' 你不需要编译 'org.springframework.data:spring-data -jpa',你能发布更多的代码,特别是配置相关的代码。
  • 是的,我知道,我已经加入了spring-data-jpa,专门用于播放它的版本。至于配置,就是这样,一切尽在build.gradle
  • 在删除其中一个或删除hibernate-core jar后尝试过
  • 请帮我解决这个问题stackoverflow.com/questions/51401850/…

标签: java spring hibernate jpa spring-boot


【解决方案1】:

可以通过在符号中添加以下作为参数来解决:

@SpringBootApplication

这将在 main 方法中:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class})

【讨论】:

    【解决方案2】:

    在将 Spring Boot 2.0.3-RELEASE 与 Hibernate/JPA 与 PostgreSQL 10 一起使用时,我遇到了同样的问题。 我对 JPA 进行了以下配置:

    @EnableJpaRepositories
    public class DomainConfiguration {
    
       @Value("${database.password}")
       private String password;
    
       @Value("${database.url}")
       private String url;
    
       @Value("${database.username}")
       private String userName;
    
       @Bean
       public DataSource dataSource() {
          DriverManagerDataSource dataSource = new DriverManagerDataSource();
          dataSource.setDriverClassName(Driver.class.getCanonicalName());
          dataSource.setUrl(this.url);
          dataSource.setUsername(this.userName);
          dataSource.setPassword(this.password);
          return dataSource;
       }
    
       @Bean
       @DependsOn("flyway")
       public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    
          HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
          vendorAdapter.setGenerateDdl(false);
    
          LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
          factory.setJpaVendorAdapter(vendorAdapter);
          factory.setJpaDialect(new HibernateJpaDialect());
          factory.setPersistenceUnitName("MTH");
          factory.setPackagesToScan("nl.mth.sync.domain");
          factory.setDataSource(dataSource());
          return factory;
       }
    
       @Bean
       public Flyway flyway(DataSource dataSource) {
          log.debug("--- configurating flyway ---");
          Flyway fly = new Flyway();
          fly.setDataSource(dataSource);
          fly.migrate();
          return fly;
       }
    
       @Bean
       public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
          JpaTransactionManager txManager = new JpaTransactionManager();
          txManager.setEntityManagerFactory(entityManagerFactory);
          return txManager;
       }
    

    我通过添加以下方法解决了这个问题:

       @Bean
       public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
          return localContainerEntityManagerFactoryBean.getObject().createEntityManager();
       }
    

    【讨论】:

    • 我使用了几乎与您相同的代码,除了您添加的 bean,并且两个 bean 具有不同的类型:我有 LocalSessionFactoryBean 而不是 LocalContainerEntityManagerFactoryBean 和 HibernateTransactionManager 而不是 PlatformTransactionManager(甚至认为 bean 的内容方法是一样的,它不起作用)。非常感谢。
    【解决方案3】:

    问题出在hibernate-core。从依赖项中删除它可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2020-02-05
      • 2020-06-10
      相关资源
      最近更新 更多