Две сессионные фабрики найдены, когда одна ожидалась - PullRequest
1 голос
/ 19 марта 2012

Я сослался на вопрос, заданный на Hibernate с использованием нескольких баз данных . Моя проблема похожа, но я сталкиваюсь с другой проблемой. Я создал два xml-файла, каждый из которых имеет отдельный источник данных и фабрику сессий. В моем web.xml у меня есть

 <context-param>
 <param-name>contextConfigLocation</param-name>
     <param-value>*The xml files* </param-value>

Как только я запускаю проект, различные загрузки и привязки выполняются из обоих файлов xml. Различные аннотации и базы данных / таблицы правильно идентифицированы. Но только после того, как это сделано, прежде чем элемент управления выходит наружу. Я получаю следующая ошибка.

    main ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed  
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoEager' defined in URL [jar:file:/C:/Users/.../.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/infobutton-service/WEB-INF/lib/core-data-1.0.0-SNAPSHOT.jar!/.../DaoHibernateEagerImpl.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [sessionFactory, profilesessionFactory]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [sessionFactory, profilesessionFactory]

Класс DaoHibernateEagerImpl равен

@Implementation
@Repository("daoEager")
public class DaoHibernateEagerImpl extends DaoHibernateImpl
{
// ========================= CONSTANTS =================================

/**
 * A logger that helps identify this class' printouts.
 */
private static final Logger log = getLogger(DaoHibernateEagerImpl.class);

// ========================= CONSTRUCTORS ==============================

/**
 * Required for a Spring DAO bean.
 *
 * @param sessionFactory
 *            Hibernate session factory
 */
@Autowired
public DaoHibernateEagerImpl(final SessionFactory sessionFactory)
{
    super(sessionFactory);
}

// ========================= DEPENDENCIES ==============================

// ========================= IMPLEMENTATION: Dao =======================



// ========================= IMPLEMENTATION: SearchEngine ==============


}

Один из файлов 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:aop="http://www.springframework.org/schema/aop"     
    xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-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/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <context:annotation-config />

<!--
    Data source: reads a properties file and injects them into a DBCP DS
    Second datasource for Resource Profiles
-->
<bean id="profiledataSource"
    class=".....ConfigurableBasicDataSource">
    <constructor-arg index="0">
        <bean class="org.apache.commons.dbcp.BasicDataSource" />
    </constructor-arg>
    <property name="properties">
        <bean

    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <property name="locations">
                <list>
                    <value>WEB-INF/datasource-local.properties
                    </value>
                </list>
            </property>
        </bean>
    </property>

    <!-- FUR-946: idle connections break. Adding connection testing. -->
    <property name="testOnBorrow" value="true" />
    <property name="testWhileIdle" value="true" />
</bean>




    <!-- Session factory -->
<!-- Session Factory for the second datasource-->
<bean id="profilesessionFactory"


   class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="profiledataSource" />

    <!--
        Hibernate configuration properties (read from a properties file)
    -->
    <property name="hibernateProperties">
        <bean

    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <property name="locations">
                <list>
                    <value>WEB-INF/hibernate.properties
                    </value>
                    <value>WEB-INF/datasource-local.properties
                    </value>

                </list>
            </property>
        </bean>
    </property>

    <!-- Using improved naming strategy -->
    <property name="namingStrategy">
        <bean class="org.hibernate.cfg.DefaultNamingStrategy" />
    </property>




    <!-- Mapping annotated classes using search patterns -->
    <property name="annotatedClasses">
        <list>
            <value><![CDATA[....profiledb.domain.Profiles]]></value>
        </list>
    </property>
</bean>

 <!--   Hibernate data access template -->
 <bean id="profilehibernateTemplate"      
  class="org.springframework.orm.hibernate3.HibernateTemplate">

  <property name="sessionFactory" ref="profilesessionFactory" />
</bean>


<tx:annotation-driven />

<!-- a PlatformTransactionManager is still required -->
<bean id="profiletransactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="profilesessionFactory" />
</bean>


<bean id="profilesdbDao" class="....profiledb.service.ProfilesDaoImpl" >
    <property name="sessionFactory" ref="profilesessionFactory"></property>

<context:component-scan base-package="....core.data" />

Другой xml-файл аналогичен, но имеет другой источник данных, а фабрика сеансов

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
 .....

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Сообщение об ошибке довольно ясно:

ожидаемый единственный соответствующий бин, но найден 2: [sessionFactory, profilesessionFactory]

Что понятно:

<bean id="profilesessionFactory"
<!-- ... -->
<bean id="sessionFactory"

Исправление должно быть простым:

@Autowired
public DaoHibernateEagerImpl(
  @Qualifier("profilesessionFactory") final SessionFactory sessionFactory)

Если вы не можете изменить класс DaoHibernateEagerImpl, вы всегда можете вернуться к конфигурации на основе XML.Сначала отключите сканирование CLASSPATH для DaoHibernateEagerImpl, чтобы @Autowired не было обнаружено.Затем просто напишите:

<bean class="DaoHibernateEagerImpl">
   <constructor-arg ref="profilesessionFactory"/>
   <!-- ... -->
</bean>

Наконец, вы можете воспользоваться директивой @Primary annotation / primary="true":

<bean id="sessionFactory" primary="true">
   <!-- ... -->

Это предпочтет sessionFactory при автопроводке, и есть двавозможности вместо того, чтобы выбрасывать исключение

0 голосов
/ 25 августа 2016

Это из-за ... если вы не упомянете @Primary (annotation) / primary = "true" (в конфигурации xml), Hiibernate не знает, какой сессионный завод выбрать. В этом случае он выдаст вам указанную ошибку , Просто попробуйте с аннотацией @Primary, она будет работать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...