225 Star 2.5K Fork 497

MyBatis-Flex/MyBatis-Flex

 / 详情

[Bug]: com.mybatisflex.spring.boot.FlexTransactionAutoConfiguration的`transactionManager`定义,未提供客制化选择

已完成
创建于  
2024-02-22 20:04

这个 Bug 是否已经存在:

如何复现:

自定义DataSourceTransactionManager的bean,名称为transactionManager,提示Bean定义重复

预期结果:

FlexTransactionAutoConfiguration上添加@ConditionalOnMissingBean(TransactionManager.class)

实际结果:

项目启动报错

截图或视频:

关联版本:

v1.7.9

评论 (5)

witt 创建了任务
witt 添加了
 
bug
标签
展开全部操作日志

换个名字试试呢?

换名字肯定是可以的

这样讲我的场景吧,一个服务需要8个数据源,有oracle ,sqlserver,postgresql等等,每个库的表是不一样的,所以我一共有8个DataSource对象的bean,8个sqlSessionFactory,然后通过@MapperScan(basePackages = { "ds1.mapper","ds2.mapper" },sqlSessionFactoryRef = "ds1SqlSessionFactory",sqlSessionTemplateRef = "ds1SqlSessionTemplate")绑定扫描

如果这个项目客制化的用户未提供数据源,使用的http接口的方式,那这个项目只有一个DataSource对象的bean,1个sqlSessionFactory

默认的DataSourcedatasource,默认的SqlSessionFactorysqlSessionFactory

Spring原生也是支持这种拓展的,@ConditionalOnSingleCandidate(DataSource.class)保证只有在单数据源才生效

输入图片说明

我改个名字没有问题,但是项目中任然存在一个sqlSessionFactory的bean,这个Bean会被作为@Transactional注解的默认事务管理器,其他协作者并不指定,他不可能每次使用加@Transactional(transactionManager = "xxxTransactionManager", rollbackFor = Exception.class)

这是mybatis flex设计的问题所在

看到你提交了这个 pr,这个思路是可以被合并的,但是通过提交的代码看到应该还有许多问题,在 很多框架 中,默认是有 transactionManager 的,而 spring 或其他框架自带的 transactionManager 在用户未知的情况下,可能覆盖掉 flex 的 transactionManager,这个并不是我们想看到的。
我们希望看到的是,在默认情况下,flex 的 transactionManager 应该覆盖掉其他框架的 transactionManager。除非手动覆盖,所以,建议提交的 pr 应该是 “手动配置覆盖” 的思路。

亦或者是,为 flex 提供一个较高权重的排序,保证能够覆盖常见的框架。

意思明白,pull request又改了一下,这样修改能满足绝大部分场景了,比Spring的早就可以

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
7984572 suomm 1698661375 5656388 wittplus 1699925437 61279 fuhai 1716893681
1
https://gitee.com/mybatis-flex/mybatis-flex.git
git@gitee.com:mybatis-flex/mybatis-flex.git
mybatis-flex
mybatis-flex
MyBatis-Flex

搜索帮助

A270a887 8829481 3d7a4017 8829481