Spring 使用 "transactionManager" 尽管指定了另一个

Spring uses "transactionManager" although another one was specified

我在尝试使用 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 吗?

谢谢。

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

并在您的存储库中添加 @Transactional(transactionManager="jpaTransactionManager")。实现默认使用不带参数的@Transactional,所以这就是它搜索默认"transactionManager" 的原因。已解释 there

在您的 spring 数据配置中,您应该向

添加一个参数
@EnableJpaRepositories(transactionManagerRef = "jtaTransactionManager")

默认值为"transactionManager"