场景

springboot 项目。原来项目中有 jdbc 事务管理,且引入了 mybatis-plus 框架。

在使用 activemq 的时候想引入事务管理,却发现报错。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' 
available: expected single matching bean but found 2: jmsTransactionManager,transactionManager

问题分析

当时知道这个错误肯定是 spring 注入的时候没有指定具体的 bean,但是查看了代码发现 config 配置的时候全部指定了名称。

按理说不应该包这个错误。

思路

后来发现是 mybatis-plus 中方法的事务导致的。

解决

修改了数据库访问相关配置

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.github.houbb.dal")
public class DatasourceConfig implements TransactionManagementConfigurer {

    @Autowired
    @Qualifier("transactionManager")
    private PlatformTransactionManager transactionManager;

    /**
     * 正常在每个事务方法上面使用 @Transactional(指定事务管理器) 但是 mybatis-plus 的 service() 方法转都是没有指定的。。。
     * 所以这里优先指定了 transactionManager。
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return transactionManager;
    }
}

反思

  1. 三方工具慎用

  2. mybatis-plus 为每个方法添加 @Transactional 的注解让人觉得很多此一举。

参考资料

https://www.jianshu.com/p/1ff821a0f070