org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有定义名为 'transactionManager' 的 bean @Spring + JPA
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined @Spring + JPA
以下是我的applicationContext.xml
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory2">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.m3.xml" />
<property name="persistenceUnitName" value="M3tables" />
<property name="packagesToScan" value="com.foo.webapp.integration.model.m3" />
</bean>
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory1">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
<property name="persistenceUnitName" value="webApp-integration" />
<property name="packagesToScan" value="com.foo.webapp.integration.model.test" />
</bean>
<!-- ##################################### -->
<!-- Transaction Manager -->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager1">
<property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager2">
<property name="entityManagerFactory" ref="entityManagerFactory2" />
</bean>
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager1" />
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager2" />
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2" />
在我的服务文件中,我以两种方式添加了事务管理器
1。通过添加 class 级别
@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
@Override
public List<Mitmas> getAllItem()
{
return mitmasRepository.findAll();
}
}
通过在方法层添加事务
@Service
public class MitmasServiceImpl implements MitmasService
{
@Override
@Transactional(value="transactionManager2")
public List<Mitmas> getAllItem()
{
return mitmasRepository.findAll();
}
}
我的完整服务文件如下
@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
@Autowired
private MitmasRepository mitmasRepository ;
@Override
@Transactional(value="transactionManager2")
public Mitmas createItem(Mitmas Mitmas)
{
return mitmasRepository.save(Mitmas);
}
@Override
@Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
public Mitmas deleteItem(String itemNo) throws ItemNotFound
{
Mitmas deleteItem = mitmasRepository.findOne(itemNo);
if(deleteItem == null)
{
throw new ItemNotFound();
}
else
{
mitmasRepository.delete(itemNo);
}
return deleteItem;
}
@Override
@Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
public Mitmas updateItem(Mitmas Mitmas) throws ItemNotFound
{
Mitmas updateItem = mitmasRepository.findOne(Mitmas.getMmitno());
if(updateItem==null)
{
throw new ItemNotFound() ;
}
updateItem.setMmitds(Mitmas.getMmitds());
updateItem.setMmfuds(Mitmas.getMmfuds());
return updateItem;
}
@Override
@Transactional(value="transactionManager2")
public List<Mitmas> getAllItem()
{
return mitmasRepository.findAll();
}
}
但是我收到以下错误
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:347)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
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.$Proxy51.findAll(Unknown Source)
at com.leanswift.webapp.services.impl.MitmasServiceImpl.getAllItem(MitmasServiceImpl.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy53.getAllItem(Unknown Source)
at com.leanswift.webApp.ui.serviceImpl.DataServiceImpl.returnBeans(DataServiceImpl.java:21)
at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.returnBeans(BrowseViewPresenterImpl.java:64)
at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.setBrowseView(BrowseViewPresenterImpl.java:56)
at com.leanswift.webApp.ui.presenter.LoginPresenter.Login(LoginPresenter.java:46)
at com.leanswift.webApp.ui.viewImpl.LoginViewImpl.buttonClick(LoginViewImpl.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
谁能帮我解决这个问题
如前所述,您在多个 EntityManagerFactory
bean 中使用 Spring Data JPA。您需要告诉 Spring Data JPA 哪个 EntityManagerFactory
和 PlatformTransactionManager
用于该特定配置。如果您不指定,它会尝试使用默认值 transactionManager
。 Spring Data JPA 参考指南中对此进行了解释 here。
Note that we require a PlatformTransactionManager
bean named transactionManager
to be present if no explicit transaction-manager-ref
is defined.
你的配置
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2" />
您只指定了 entity-manager-factory-ref
而不是 transaction-manager-ref
因此它试图找到一个名为 transactionManager
的 PlatformTransactionManager
。
要修复,请向元素添加适当的 transaction-manager-ref
。
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1"
transaction-manager-ref="transactionManager1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2"
transaction-manager-ref="transactionManager2" />
以下是我的applicationContext.xml
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory2">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.m3.xml" />
<property name="persistenceUnitName" value="M3tables" />
<property name="packagesToScan" value="com.foo.webapp.integration.model.m3" />
</bean>
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory1">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
<property name="persistenceUnitName" value="webApp-integration" />
<property name="packagesToScan" value="com.foo.webapp.integration.model.test" />
</bean>
<!-- ##################################### -->
<!-- Transaction Manager -->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager1">
<property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager2">
<property name="entityManagerFactory" ref="entityManagerFactory2" />
</bean>
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager1" />
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager2" />
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2" />
在我的服务文件中,我以两种方式添加了事务管理器
1。通过添加 class 级别
@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
@Override
public List<Mitmas> getAllItem()
{
return mitmasRepository.findAll();
}
}
通过在方法层添加事务
@Service public class MitmasServiceImpl implements MitmasService { @Override @Transactional(value="transactionManager2") public List<Mitmas> getAllItem() { return mitmasRepository.findAll(); } }
我的完整服务文件如下
@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
@Autowired
private MitmasRepository mitmasRepository ;
@Override
@Transactional(value="transactionManager2")
public Mitmas createItem(Mitmas Mitmas)
{
return mitmasRepository.save(Mitmas);
}
@Override
@Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
public Mitmas deleteItem(String itemNo) throws ItemNotFound
{
Mitmas deleteItem = mitmasRepository.findOne(itemNo);
if(deleteItem == null)
{
throw new ItemNotFound();
}
else
{
mitmasRepository.delete(itemNo);
}
return deleteItem;
}
@Override
@Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
public Mitmas updateItem(Mitmas Mitmas) throws ItemNotFound
{
Mitmas updateItem = mitmasRepository.findOne(Mitmas.getMmitno());
if(updateItem==null)
{
throw new ItemNotFound() ;
}
updateItem.setMmitds(Mitmas.getMmitds());
updateItem.setMmfuds(Mitmas.getMmfuds());
return updateItem;
}
@Override
@Transactional(value="transactionManager2")
public List<Mitmas> getAllItem()
{
return mitmasRepository.findAll();
}
}
但是我收到以下错误
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:347)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
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.$Proxy51.findAll(Unknown Source)
at com.leanswift.webapp.services.impl.MitmasServiceImpl.getAllItem(MitmasServiceImpl.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy53.getAllItem(Unknown Source)
at com.leanswift.webApp.ui.serviceImpl.DataServiceImpl.returnBeans(DataServiceImpl.java:21)
at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.returnBeans(BrowseViewPresenterImpl.java:64)
at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.setBrowseView(BrowseViewPresenterImpl.java:56)
at com.leanswift.webApp.ui.presenter.LoginPresenter.Login(LoginPresenter.java:46)
at com.leanswift.webApp.ui.viewImpl.LoginViewImpl.buttonClick(LoginViewImpl.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
谁能帮我解决这个问题
如前所述,您在多个 EntityManagerFactory
bean 中使用 Spring Data JPA。您需要告诉 Spring Data JPA 哪个 EntityManagerFactory
和 PlatformTransactionManager
用于该特定配置。如果您不指定,它会尝试使用默认值 transactionManager
。 Spring Data JPA 参考指南中对此进行了解释 here。
Note that we require a
PlatformTransactionManager
bean namedtransactionManager
to be present if no explicittransaction-manager-ref
is defined.
你的配置
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2" />
您只指定了 entity-manager-factory-ref
而不是 transaction-manager-ref
因此它试图找到一个名为 transactionManager
的 PlatformTransactionManager
。
要修复,请向元素添加适当的 transaction-manager-ref
。
<jpa:repositories base-package="com.foo.webapp.test.repository"
entity-manager-factory-ref="entityManagerFactory1"
transaction-manager-ref="transactionManager1" />
<jpa:repositories base-package="com.foo.webapp.repository"
entity-manager-factory-ref="entityManagerFactory2"
transaction-manager-ref="transactionManager2" />