2015-10-14 10 views
5

Sto utilizzando 2 origini dati Weblogic; Nelle mie configurazioni XML ho 2 unità di persistenza, 2 entityManagerFactories e 2 transactionManagers. I file sono i seguenti:Nessun bean qualificante di tipo [org.springframework.transaction.PlatformTransactionManager] è definito

persistence.xml:

<persistence-unit name="modelPersistence" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
</persistence-unit> 

<persistence-unit name="orderPersistence" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
</persistence-unit> 

config.xml:

<!-- transactionManagers --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

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

<!-- entityManagerFactory --> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSourceModel"/> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="persistenceUnitName" value="modelPersistence" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="eclipselink.logging.level">FINE</prop> 
      </props> 
     </property> 
     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" /> 
       <property name="generateDdl" value="true"/> 
       <property name="showSql" value="true"/> 
      </bean> 
     </property> 
    </bean>  

<!-- entityManagerFactoryLegacy --> 
     <bean id="entityManagerFactoryLegacy" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSourceOrder"/> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="persistenceUnitName" value="orderPersistence" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="eclipselink.logging.level">FINE</prop> 
      </props> 
     </property> 
     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" /> 
       <property name="generateDdl" value="true"/> 
       <property name="showSql" value="true"/> 
      </bean> 
     </property> 
    </bean> 

<!-- data source 1--> 
    <bean id="dataSourceModel" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="model-datasource-jndi"> 
     <property name="jndiName" ref="model-datasource-jndi" /> 
     <property name="resourceRef" value="true" /> 
    </bean> 

<!-- data source 2--> 
    <bean id="dataSourceOrder" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="order-datasource-jndi"> 
     <property name="jndiName" ref="order-datasource-jndi" /> 
     <property name="resourceRef" value="true" /> 
    </bean> 

<!-- configure persistenceUnitManager --> 
    <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="dataSources"> 
     <map> 
      <entry key="jdbc/MODEL-DS" value-ref="dataSourceModel"/> 
      <entry key="jdbc/ORDER-DS" value-ref="dataSourceOrder"/> 
     </map> 
     </property> 
    </bean> 
    <jpa:repositories base-package="org.codingpedia.demo.repositories.ModelRepository" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/> 
    <jpa:repositories base-package="org.codingpedia.demo.repositories.OrderRepository" entity-manager-factory-ref="entityManagerFactoryLegacy" transaction-manager-ref="transactionManagerLegacy"/> 

ModelRepository:

@Repository ("ModelRepo") 
@PersistenceContext(unitName = "modelPersistence") 
public interface ModelRepository extends JpaRepository<Model, String> {} 

orderRepository:

@Repository ("OrderRepo") 
@PersistenceContext(unitName = "orderPersistence") 
public interface OrderRepository extends JpaRepository<Model, String> {} 

Eventuali suggerimenti sul corretto annotazioni per la gestione di più gestori di transazioni? Mi manca qualcos'altro? Altri esempi di overflow dello stack utilizzano DAO che non ho trovato utili poiché sto utilizzando i repository, il modello e i file java del controller. Inoltre, non sto utilizzando la modalità di sospensione, come molti esempi di riferimento. La tua intuizione è apprezzata.

Sto ricevendo il seguente errore:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: transactionManagerLegacy,transactionManager 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:370) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy120.findAll(Unknown Source) 
    at org.codingpedia.demo.controller.BaseController.index(BaseController.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254) 
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3432) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285) 
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201) 
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572) 
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263) 
+0

Si sta utilizzando Spring Data JPA Suggerisco una lettura della documentazione. Vedi http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#_custom_namespace_attributes. Sono necessari più elementi '' per ciascuno dei diversi repository, ciascuno legato al gestore di entità e gestore di transazioni corretti. Fondamentalmente al momento lo stai facendo chiaramente. –

+0

È necessario configurare spring-data-jpa correttamente al momento la configurazione è sbagliata, che è anche ciò che la documentazione sta dicendo. Non ha nulla a che fare con l'ibernazione o non si tratta di configurare correttamente Spring Data JPA, ma ha bisogno di sapere quale gestore di entità e gestore delle transazioni usare per quali repository. Anche avere 2 elementi '' non funziona, si può avere solo uno, o almeno uno (l'ultimo definito) sarà utile. –

+0

È necessario disporre di un altro elemento repository o '@ EnableJpaRepositories' da qualche parte che utilizza i valori predefiniti o tenta di farlo. Probabilmente nella configurazione caricata da 'DispatcherServlet'. –

risposta

5

È possibile utilizzare:

@Transactional("transactionManagerName") 

See org.springframework.transaction.annotation.Transactional (@Transactional) annotazione javadoc:

/** 
* A qualifier value for the specified transaction. 
* <p>May be used to determine the target transaction manager, 
* matching the qualifier value (or the bean name) of a specific 
* {@link org.springframework.transaction.PlatformTransactionManager} 
* bean definition. 
*/ 
String value() default ""; 
+0

Ho provato quell'annotazione e ho ottenuto lo stesso errore sfortunatamente. – Jay113

+1

Quindi per favore prova a configurare il gestore delle transazioni per tutti i reposli (per vedere se aiuta): rgrebski

+0

Conosci qualche altro risorse? – Jay113

0

Nel tuo caso dovrebbe essere:

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

perché questo è l'ID dei tuoi fagioli.

Se volete origine dati più vi suggerisco di leggere questo: http://www.baeldung.com/spring-data-jpa-multiple-databases

+1

In questo esempio si utilizza l'astrazione JPA di Spring ORM. Non c'e 'nessuno JAR in letargo coinvolto. sì, sta usando l'ibernazione sotto il cofano, ma puoi cambiarlo con quello che vuoi. Anche questo tutorial mostra come ottenere due origini dati in Spring JPA –

+1

Non focalizzare sul fatto di ibernazione (che è irrilevante) la parte importante è che ti mostra (che ignori) come configurare Spring Data JPA ** correttamente per più 'EntityManagerFactory's e' TransactionManager's **. Aggiornamento –

+0

: Grazie per l'aiuto ragazzi, sono davvero nuovo in questo concetto. @ M.Deinum Ho aggiunto le 2 istruzioni nell'applicazione-context.xml e ho usato l'esempio e sostituito l'ibernazione per Eclipse Link, ancora senza fortuna. – Jay113

0

Attualmente Dali supporta solo uno Persistenza Unità e un file di persistenza XML per progetto. Altre configurazioni possono esistere in un progetto JPA, ma l'elaborazione della validazione e dei valori predefiniti potrebbe non essere corretta quando si utilizzano più unità di persistenza. Controlla ulteriori informazioni here.

Problemi correlati