Spring使用“transactionManager”,虽然指定了另一个

时间:2016-09-16 09:48:41

标签: spring spring-transactions

尝试使用Spring事务时出现以下错误:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'transactionManager' - neither qualifier match nor bean name match!

虽然我已经指定了另一个名字。这是代码片段:

@EnableTransactionManagement
public class TransactionConfig {
...
    @Bean
    @Qualifier(value ="jpaTransactionManager")
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory emf) {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(emf);
    tm.setDataSource(primaryDataSource());
    return tm;
}

    @Bean()
    @Qualifier(value="jtaTransactionManager")
    public JtaTransactionManager jtaTransactionManager(UserTransactionManager    atomikosTransactionManager) {
      ......

我这样使用它:

@Transactional(transactionManager="jpaTransactionManager")
public class UserService {

public Iterable<FVUser> findWithQuery(Specification<FVUser> spec) {
    return repository.findAll(spec);
} 

存储库:

@Repository
public interface UserRepository extends PagingAndSortingRepository<FVUser, String>, JpaSpecificationExecutor<FVUser>  {

调试时我注意到它正确地使用“jpaTransactionManger”来调用服务方法,但似乎找到了一个“transactionManager”来调用存储库方法,尽管没有为它指定任何事务。

有人知道为什么Spring在这种情况下寻找默认的“transactionManager”bean吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我认为你应该用PlatformTransactionManager标记@Bean

在您的存储库中添加@Transactional(transactionManager="jpaTransactionManager")。默认情况下,实现使用没有参数的@Transactional,这就是它搜索默认值&#34; transactionManager&#34;的原因。它被解释为there

答案 1 :(得分:0)

在弹簧数据配置中,您应该添加一个参数

@EnableJpaRepositories(transactionManagerRef = "jtaTransactionManager")

默认值为“transactionManager”