没有为依赖找到类型 [org.hibernate.SessionFactory] 的匹配 bean
Posted
技术标签:
【中文标题】没有为依赖找到类型 [org.hibernate.SessionFactory] 的匹配 bean【英文标题】:No matching bean of type [org.hibernate.SessionFactory] found for dependency 【发布时间】:2013-03-19 23:08:15 【问题描述】:我是 Spring MVC 的初学者。我遇到了一个问题“没有为依赖项找到类型为 [org.hibernate.SessionFactory] 的匹配 bean:预计至少有 1 个 bean 符合此依赖项的自动装配候选条件。”并且花费了很多时间。
我使用了 Maven 构建管理。我的项目有一个包含 2 个模块的项目:springcore (jar) 和 springmvc (web app)。而springmvc(web app)一直是依赖spring core。在模块 spring core 中,我定义了所有的包,如 dom、dao、service 及其实现,我还在 src/main/resources 中定义了 applicationContext.xml:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Activates scanning of @Autowired -->
<context:annotation-config />
<context:component-scan base-package="com.netvn" />
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="$jdbc.driverClassName"
p:url="$jdbc.databaseurl" p:username="$jdbc.username" p:password="$jdbc.password" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.netvn.dom.Contact</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.mysqlDialect</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">10</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
ContactDaoImpl.java
@Repository
public class ContactDaoImpl implements ContactDao
private Log log = LogFactory.getLog(ContactDaoImpl.class);
@Autowired
private SessionFactory sessionFactory;
public List<Contact> listContact()
Session session = sessionFactory.getCurrentSession();
Query q = session.createQuery("select g from Contact g order by id desc");
List<Contact> contactList= q.list();
return contactList;
ContactServiceImpl.java
@Service
@Transactional
public class ContactServiceImpl implements ContactService
@Autowired
private ContactDao contactDao;
@Transactional(propagation=Propagation.REQUIRED)
public List<Contact> listContact()
return contactDao.listContact();
在 springmvc (web app) 中,我定义了 web.xml 和 dispatcher-servlet.xml
调度程序-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<mvc:annotation-driven />
<context:component-scan base-package="com.netvn.dao" />
<context:component-scan base-package="com.netvn.service" />
<context:component-scan base-package="com.netvn.controller" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:*.xml
</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
这是我尝试在 Tomcat 6.0 服务器中运行它时遇到的问题
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.netvn.dao.impl.ContactDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)
... 86 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
谁能告诉我,Web 应用程序上下文无法创建 SessionFactory 的原因是什么,或者当我配置 SessionFactory 时出现任何问题。
任何支持将不胜感激。
【问题讨论】:
使用的休眠版本 能否确认applicationContext.xml文件是否复制到classpath并加载完毕 我为我的项目使用了 spring 版本 3.0.5 RELEASE 和 hibernate-core-3.3.2.GA 依赖项。我的项目依赖有问题吗? 在这里显示***.com/questions/8961275/… 看起来注释没有按照 标签的指示拾取。这可能是由于“contextConfigLocation”配置参数未按预期从 web.xml 中选取。 【参考方案1】:一般问题是类路径中缺少配置/类,无论是您自己的库。再次检查导入和配置是否正确:
要么使用类路径扫描来自动检测实体类:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="test.package"/>
</bean>
或最重要的:AnnotationSessionFactoryBean 类需要 Hibernate 3.2 或更高版本,并具有 Java Persistence API 和 Hibernate Annotations 插件。
参考:https://docs.spring.io/spring/docs/3.2.8.RELEASE/javadoc-api/org/springframework/orm/hibernate3/annotation/AnnotationSessionFactoryBean.html
【讨论】:
【参考方案2】:尝试直接将您的应用程序上下文导入dispatcher-servlet.xml(它正在正确加载),如下所示。
<import resource="classpath:WEB-INF/applicationContext.xml" />
【讨论】:
【参考方案3】:您的 sessionfactory 未正确初始化。
阅读您的错误在哪里以及抛出什么。这是
无法自动装配字段:私有 org.hibernate.SessionFactory
您需要正确初始化 SessionFactory
现在如何测试它非常简单。首先删除代码中添加的 sessionfactory。测试数据源是否正确初始化
将数据源添加为自动装配。 @自动连线 数据源数据源;
在您的方法中,您可以轻松地执行 dataSource.getConnection。如果您能够使用普通 jdbc 进行测试,那么您就更近了一步。
如果您的数据源配置正确,您可以在第二步中测试您的会话工厂。
我认为 conext 扫描不会给您带来任何问题,因为它说自动连线失败。所以你的数据源和 sessionfactory bean 没有在 xml 中正确设置
【讨论】:
以上是关于没有为依赖找到类型 [org.hibernate.SessionFactory] 的匹配 bean的主要内容,如果未能解决你的问题,请参考以下文章
Spring + Hibernate:没有为当前线程找到会话
“xxxDAOImpl”中的字段会话需要一个“org.hibernate.SessionFactory”类型的 bean,但无法找到
运行动态Web项目tomcat时出现问题“只能导入一个类型。 org.hibernate.cfg.Configuration解析为一个包“
原因:org.hibernate.QueryException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.MethodNode
hibernate hsql得到错误节点没有数据类型:org.hibernate.hql.ast.tree.IdentNode
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为类 org.hibernate.proxy.pojo.bytebudd