【问题标题】:No qualifying bean of type 'java.util.Set<javax.persistence.EntityManager>没有“java.util.Set<javax.persistence.EntityManager>”类型的限定 bean
【发布时间】:2017-11-21 09:01:47
【问题描述】:

在我的 pom.xml 文件中添加 spring-boot-starter-data-jpa 的依赖项后。我收到此错误。 我搜索并找到this,它说删除休眠核心的依赖将解决这个问题。但是,错误仍然存​​在。

这是我的堆栈跟踪:

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.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]
at com.netpace.firebase.NetpaceFirebaseNotificationsApplication.main(NetpaceFirebaseNotificationsApplication.java:20) [classes/: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:1493) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
... 19 common frames omitted

这是我的 applicationContext.xml 文件:

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
    <property name="url"
        value="jdbc:sqlserver://localhost;databaseName=Firebase_Notification" />
    <property name="username" value="sa" />
    <property name="password" value="admin123" />

</bean>
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>

<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

当我在我的类中自动装配 sessionFactory 时,它会抛出这个异常。我不知道我做错了什么,我是 Java spring 的新手,在 eclipse 中配置东西真的是一团糟。

这是我使用 sessionFactory 的课程:

@Component
public class BaseClass<T> implements IBaseDAO<T> {

@Autowired
private SessionFactory sessionFactory;

@Autowired
private ErrorResponse error;

@Override
public Object save(T object) {
    // TODO Auto-generated method stub
    return this.getSession().save(object);
}

@Override
public void remove(T object) {
    // TODO Auto-generated method stub
    this.getSession().delete(object);
}

@SuppressWarnings("unchecked")
@Override
public T update(T object) {
    // TODO Auto-generated method stub
    return (T) this.getSession().merge(object);
}

@SuppressWarnings("unchecked")
@Override
public T findById(long id, Class<?> persistClass) {
    // TODO Auto-generated method stub
    return (T) this.getSession().get(persistClass, id);
}

public SessionFactory getSessionFactory() {
    // sessionFactory = configuration.configure().buildSessionFactory();
    return sessionFactory;
}

public Session getSession() {
    SessionFactory session = getSessionFactory();
    return session.getCurrentSession();

}

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorResponse> handle(RuntimeException ex) {
    error.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
    error.setMessage(ex.getMessage());
    return new ResponseEntity<ErrorResponse>(error, HttpStatus.INTERNAL_SERVER_ERROR);

}

}

【问题讨论】:

  • 这是一个 Spring Boot 项目吗?或者你只是使用那个依赖?
  • 这是一个spring boot项目。

标签: java spring hibernate maven spring-data-jpa


【解决方案1】:

如果你想使用自定义的 sessionFactory / EntityManager,你需要在 application.properties 文件中关闭 spring boot 的自动配置:

spring.autoconfigure.exclude=
     org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
   , org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

【讨论】:

  • 对于那些仍然面临这个问题的人:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class})
  • @MaximMarkov,非常感谢,它起作用了@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class}) 这个有什么魔力。请详细解释一下,
  • 为什么在 spring boot+Hibernate 集成中的 application.properties 和 DataSourceConfiguration.java 中提到显式对话时会考虑自动配置
  • @MaximMarkov,非常感谢。它就像一个魅力。
【解决方案2】:

我通过更新 Spring Boot 版本解决了这个问题,如下所示(在 pom.xml 中):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

这似乎是这里讨论的 spring 框架中的一个错误

Error bootstrapping Spring Data JPA with EntityManagerFactory already semi-initialized

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2018-07-25
    • 2015-12-24
    • 2017-08-23
    相关资源
    最近更新 更多