2013-07-24 10 views
13

Jestem wiosną 3.2. Oto mój plik konfiguracyjnyBłąd pobierania Nie zdefiniowano fasoli kwalifikacyjnej typu [javax.persistence.EntityManagerFactory]: oczekiwano pojedynczego pasującego komponentu bean, ale znaleziono 2

<bean id="legacyDataSource" name="legacydb" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="true"> 
    <property name="driverClassName" value="${jdbc.legacy.driverClassName}" /> 
    <property name="url" value="${jdbc.legacy.url}" /> 
    <property name="username" value="${jdbc.legacy.username}" /> 
    <property name="password" value="${jdbc.legacy.password}" /> 
</bean> 

<bean id="ls360DataSource" name="Ls360db" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="true" > 
    <property name="driverClassName" value="${jdbc.ls360.driverClassName}" /> 
    <property name="url" value="${jdbc.ls360.url}" /> 
    <property name="username" value="${jdbc.ls360.username}" /> 
    <property name="password" value="${jdbc.ls360.password}" /> 
</bean> 

<bean id="legacyTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="legacyEmf"/> 
</bean> 

<bean id="ls360TransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="ls360Emf"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="legacyEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="dataSource" ref="legacyDataSource" /> 
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />   
    <property name="packagesToScan" value="com.softech.ls360.integration.regulators.plcb.domain"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</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>    
     </props>   
    </property> 
</bean> 

<bean id="ls360Emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="dataSource" ref="ls360DataSource" /> 
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />   
    <property name="packagesToScan" value="com.softech.ls360.integration.regulators.plcb.domain"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</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>    
     </props>   
    </property> 
</bean> 
<context:component-scan base-package="....db" /> 

Oto moja klasa

@Service("dbManager") 
@Repository 
@Transactional 
public class DatabaseManager { 

    @PersistenceContext 
    @Qualifier("legacyEmf") 
    private EntityManager legacyEm; 

    @PersistenceContext 
    @Qualifier("ls360Emf") 
    private EntityManager ls360Em; 

    @SuppressWarnings("unchecked") 
    @Transactional(readOnly=true) 
    public List<Object> getResultList(String query, Class mappingClass) throws Exception { 

     //Query emQuery = legacyEm.createNativeQuery(query, mappingClass); 

     //return emQuery.getResultList(); 
     return null; 

    } //end of findTraineeFromLegacy() 
} 

Teraz kiedy rum kod otrzymuję następujący błąd

Error creating bean with name 'dbManager': Injection of persistence 
dependencies failed; nested exception is 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: 
expected single matching bean but found 2: legacyEmf,ls360Emf 

Dlaczego otrzymuję ten błąd. Jak mogę to rozwiązać?

Dzięki

+0

sam problem tutaj, ale proponowane rozwiązanie nie działa dla testów jednostkowych. Czy wypróbowałeś test wiosny na junicie? –

Odpowiedz

16

Dziś miałem ten sam problem. Rozwiązać go w następujący sposób:

pierwsze Dodałem parametr unitName do @PersistenceContext obu właściwości kierownika jednostki:

@PersistenceContext(unitName="appPU") 
@Qualifier(value = "appEntityManagerFactory") 
private EntityManager appEntityManager; 

@PersistenceContext(unitName="managerPU") 
@Qualifier(value = "managerEntityManagerFactory") 
private EntityManager managerEntityManager; 

A w moim pliku konfiguracyjnego Dodałem właściwość persistenceUnitName do moich definicjach fasoli :

<bean id="appEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource1" /> 
    <property name="persistenceUnitName" value="appPU" /> 
    <property name="packagesToScan" value="br.com.app.domain" /> 
    ... 
</bean> 

<bean id="managerEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource2" /> 
    <property name="persistenceUnitName" value="managerPU" /> 
    <property name="packagesToScan" value="br.com.app.domain" /> 
    ... 
</bean> 
+1

To jest dziwne, ponieważ mam dokładnie ten sam problem dzisiaj, ale @Qualifier nie działa = (. Jestem prawie pewien, że wszystkie moje konfiguracje są w porządku, czy mógłbyś opublikować całą aplikacjęContext? Dziękuję – Marcelo

+0

Rozwiązanie nie działa dla testu junit ('AbstractTransactionalJUnit4SpringContextTests'), żadnego pomysłu dlaczego? –

+0

Wielkie dzięki! To zadziałało dla mnie.Za pomocą' @ PersistenceContex' with unitName wystarcza rozwiązanie wtrysku.Nie jest konieczne użycie '@ Kwalifikator', ponieważ wstrzykujesz EntityManager zamiast EntityManagerFactory –

4

Chciałbym dodać jeszcze jeden przydatny komentarz: musisz rozszerzyć sekcję w pliku "web.xml" swojej aplikacji internetowej. Od teraz masz 2 menedżerów encji, potrzebujesz 2 OpenEntityManagerInViewFilters. Spójrz na przykład:

<filter> 
    <filter-name>OpenEntityManagerInViewFilter1</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>appEntityManagerFactory</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>OpenEntityManagerInViewFilter1</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 


<filter> 
    <filter-name>OpenEntityManagerInViewFilter2</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>managerEntityManagerFactory</param-value> 
    </init-param> 
    </filter> 

<filter-mapping> 

<filter-name>OpenEntityManagerInViewFilter2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

zwrócić uwagę na fakt, nazwa 'appEntityManagerFactory' w < param-value> appEntityManagerFactory </param-value> = 'appEntityManagerFactory' w < bean id = "appEntityManagerFactory".

1

Ja także stanąłem przed takim problemem i rozwiązałem go.

wykonaj następujące czynności, aby rozwiązać ten błąd

dodaj następującą linijkę do wszystkich klas podmiot zarówno schematu.

@PersistenceContext(unitName="persistenceUnit") 
transient EntityManager entityManager; 

gdzie „persistenceUnit” to nazwa jednostki oporność zdefiniowano w pliku persistance.xml

Powiązane problemy