2016-09-16 174 views
0

尝试使用Spring的事务中时,我得到以下错误:Spring使用“transactionManager的”,虽然另一个指定

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?

谢谢。

回答

0

在Spring数据CONFIGS你应该一个参数添加到

@EnableJpaRepositories(transactionManagerRef = "jtaTransactionManager") 

默认值是 “transactionManager的”

+0

是的。这是修复。谢谢。 – csm86

0

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

并在您的存储库中添加@Transactional(transactionManager="jpaTransactionManager")。实现默认使用@Transactional,没有参数,所以这就是为什么它正在搜索默认的“transactionManager”。据介绍there

+0

对不起。这是一个豆。我只是错误地跳过了它。我更新了这篇文章。 – csm86

+0

我也在存储库中添加了@Transactional(transactionManager =“jpaTransactionManager”),但结果相同。无论如何,我不希望存储库方法是事务性的。只是将服务方法包装在事务中。 – csm86