Не найден соответствующий bean-компонент типа [org.hibernate.SessionFactory] для зависимости

Я новичок в Spring MVC. Я столкнулся с проблемой «Не найдено подходящего компонента типа [org.hibernate.SessionFactory] для зависимости: ожидается по крайней мере 1 компонент, который квалифицируется как кандидат автоподключения для этой зависимости.» и трачу много времени.

Я использовал управление сборкой maven. В моем проекте есть проект, состоящий из 2 модулей: springcore (jar) и springmvc (веб-приложение). И springmvc (веб-приложение) было зависимым ядром Spring. В модуле spring core я определил все пакеты, такие как dom, dao, service и их реализацию, а также определил applicationContext.xml в src/main/resources следующим образом:

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>

КонтактыDaoImpl.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.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>

веб.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)

Может кто-нибудь сказать мне, по какой причине SessionFactory не может быть создан контекстом веб-приложения или какой-либо проблемой, когда я настроил SessionFactory.

Любая поддержка будет оценена.


person Phạm Thanh Tùng    schedule 29.03.2013    source источник
comment
используется спящая версия   -  person Arun P Johny    schedule 29.03.2013
comment
можете ли вы подтвердить, скопирован ли файл applicationContext.xml в путь к классам и загружен ли он   -  person Arun P Johny    schedule 29.03.2013
comment
Я использовал весеннюю версию 3.0.5 RELEASE и зависимость hibernate-core-3.3.2.GA для своего проекта. Любая проблема с зависимостями моего проекта?   -  person Phạm Thanh Tùng    schedule 29.03.2013
comment
Покажите здесь stackoverflow. com/questions/8961275/   -  person ctesniere    schedule 21.05.2013
comment
похоже, что аннотации не подбираются, как указано в теге ‹context:annotation-config /›. Это может быть связано с тем, что параметр конфигурации contextConfigLocation не выбран должным образом из web.xml.   -  person teon    schedule 18.04.2015
comment
Объедините сервлет диспетчера и XML-файл контекста приложения в один XML-файл.   -  person Acewin    schedule 12.10.2016
comment
Создайте сеттер для sessionFactory.   -  person Sumit Kumar    schedule 22.12.2017


Ответы (3)


В целом проблема заключается в отсутствии конфигурации/классов из пути к классам, независимо от того, является ли ваша собственная библиотека. Еще раз проверьте правильность импорта и настройки:

  1. Либо используйте сканирование путей к классам для автоматического определения классов сущностей:
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="test.package"/> </bean>

  2. ИЛИ САМОЕ ВАЖНОЕ: для класса 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

person Amit    schedule 25.03.2018

Попробуйте напрямую импортировать контекст приложения в файл dispatcher-servlet.xml (который загружается правильно), как показано ниже.

<import resource="classpath:WEB-INF/applicationContext.xml" />

person Essex Boy    schedule 05.01.2016

Ваш sessionfactory неправильно инициализируется.

Прочитай свою ошибку где и что кидается. который

Не удалось автоматически связать поле: private org.hibernate.SessionFactory

Вам нужно правильно инициализировать SessionFactory

Теперь, как проверить это довольно просто. Сначала удалите sessionfactory, добавленный в ваш код. Проверьте, правильно ли инициализируется источник данных

Добавить источник данных как autowire. @Autowired DataSource источник данных;

в ваших методах вы можете легко сделать dataSource.getConnection. Если вы можете протестировать простой jdbc, вы на шаг ближе.

Если ваш источник данных настроен правильно, вы можете протестировать свою сессионную фабрику в качестве второго шага.

Я не думаю, что сканирование контекста вызывает у вас какие-либо проблемы, поскольку оно говорит о сбое автоматического подключения. Таким образом, ваш источник данных и компоненты sessionfactory неправильно настроены в xml

person Acewin    schedule 12.10.2016