2016-04-21 78 views
0

我想在我的春天項目中添加兩個數據源,但是,我得到這個錯誤創建兩個數據源與Spring

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ajaxController': 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: entityManagerFactory,entityManagerFactoryDataGathering 
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:357) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4729) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: entityManagerFactory,entityManagerFactoryDataGathering 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:572) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:531) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:697) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:670) 
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354) 
    ... 22 more 

這裏是我的dispatcher-servlet.xml的相關部分:

<jee:jndi-lookup id="benDS" jndi-name="jdbc/ben" 
    expected-type="javax.sql.DataSource" /> 

<jee:jndi-lookup id="benDS_data_gathering" 
    jndi-name="jdbc/ben_data_gathering" expected-type="javax.sql.DataSource" /> 

<!-- Session Factory Declaration --> 
<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="benDS" /> 
    <property name="persistenceUnitName" value="ben" /> 
    <property name="packagesToScan" value="com.ben.*" /> 
</bean> 

<bean id="entityManagerFactoryDataGathering" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="benDS_data_gathering" /> 
    <property name="persistenceUnitName" value="ben_data_gathering" /> 
    <property name="packagesToScan" value="com.ben.*" /> 
</bean> 

<tx:annotation-driven /> 

<!-- Transaction Manager is defined --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

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

這是我UserDAO.java

@PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName = "ben") 
@Qualifier(value = "entityManagerFactory") 
private EntityManager em; 

@PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName = "ben_data_gathering") 
@Qualifier(value = "entityManagerFactoryDataGathering") 
private EntityManager em1; 

在Tomcat中,這裏是我的context.xml

<Resource name="jdbc/ben" auth="Container" type="javax.sql.DataSource" 
    maxActive="-1" maxIdle="-1" maxWait="-1" autoReconnect="true" 
    username="example" password="example" driverClassName="com.mysql.jdbc.Driver" 
    spring.datasource.testOnBorrow="true" 
    spring.datasource.validationQuery="SELECT 1" 
    url="example" /> 

<Resource name="jdbc/ben_data_gathering" auth="Container" type="javax.sql.DataSource" 
    maxActive="-1" maxIdle="-1" maxWait="-1" autoReconnect="true" 
    username="example" password="example" driverClassName="com.mysql.jdbc.Driver" 
    spring.datasource.testOnBorrow="true" 
    spring.datasource.validationQuery="SELECT 1" 
    url="example" /> 

最後,我persistence.xml

<persistence-unit name="ben" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>java:/comp/env/jdbc/ben</non-jta-data-source> 
    <properties> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.jdbc.batch_size" value="20" /> 
     <property name="hibernate.cache.use_query_cache" value="false" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.cache.use_second_level_cache" 
      value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <property name="jadira.usertype.autoRegisterUserTypes" 
      value="true" /> 
    </properties> 
</persistence-unit> 

<persistence-unit name="ben_data_gathering" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>java:/comp/env/jdbc/ben_data_gathering</non-jta-data-source> 
    <properties> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.jdbc.batch_size" value="20" /> 
     <property name="hibernate.cache.use_query_cache" value="false" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.cache.use_second_level_cache" 
      value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <property name="jadira.usertype.autoRegisterUserTypes" 
      value="true" /> 
    </properties> 
</persistence-unit> 

我一直在尋找周圍SO尋求幫助,我不能得到任何進展。我如何能夠正確添加第二個數據源?我能夠做到這一點,只是一個很好。

+0

你也可以發佈ajaxController的代碼和嵌套對象需要連接到它裏面嗎?我們可能需要從問題的根源來追蹤它。 –

回答

1

創建bean'ajaxController'時發生錯誤,創建UserDAO時發生錯誤。你有沒有在ajaxController中連接EntityManager?!

Error creating bean with name 'ajaxController' 
+0

哈,有趣的事情。我在同一個工作場所有兩個版本的項目。我刪除了錯誤版本的EntityManager,這就是爲什麼它出現錯誤... – bmarkham

+0

所以是的,我做了,但在錯誤的項目。我給你+1,這樣你就可以更快地獲得對帖子評論的權限;) – bmarkham