【问题标题】:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined @Spring + JPAorg.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“transactionManager”的bean @Spring + JPA
【发布时间】:2015-05-21 10:09:09
【问题描述】:

以下是我的 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 .通过添加类级别

@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
    @Override
    public List<Mitmas> getAllItem() 
    {
        return mitmasRepository.findAll();

    }
}
  1. 通过在方法层添加事务

    @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$1.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$1.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)

谁能帮我解决这个问题

【问题讨论】:

  • 你在某个地方有一个 @Transactional 没有值属性,这意味着 @Transactional("transactionManager")。您应该有一个BeanCreationExceptionNoSuchBeanDefinitionException 是其根本原因
  • 作为补充,你只需要一个&lt;tx:annotation-driven /&gt;,基本上你的第一个是没用的,因为第二个会覆盖它。
  • @orid ,我已经检查了我的服务文件,并且它具有 @Transactional(value="transactionManager2") 的所有方法。仍然抛出相同的异常
  • @M.Deinum 感谢您提供的信息,但我仍然面临问题
  • 您正在使用 Spring Data JPA,并且这些存储库使用默认 @Transactional 进行注释。您将需要多个 configrue 2 spring jpa 块并指定要使用的事务管理器和实体管理器(您可能已经有一个与 entitymanager 添加事务管理器)。

标签: java spring hibernate spring-data-jpa


【解决方案1】:

如前所述,您正在使用 Spring Data JPA 和多个 EntityManagerFactory bean。您需要告诉 Spring Data JPA 哪个 EntityManagerFactoryPlatformTransactionManager 用于该特定配置。如果你不指定它会尝试使用默认的transactionManager。这在 Spring Data JPA 参考指南中的 here 中有解释。

请注意,如果没有明确定义 transaction-manager-ref,我们需要一个名为 transactionManagerPlatformTransactionManager bean。

你的配置

<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,因此它试图找到一个名为transactionManagerPlatformTransactionManager

要修复将适当的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" />

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2018-01-05
    • 2013-01-25
    • 2012-05-29
    • 2014-11-14
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多