如何 mybatisplus 项目中覆盖 jar 中的 mapper.xml 文件

8 天前
 iv8d
## 覆盖 jar 中的 mapper.xml 文件

mybatis plus 里的 xml 文件,如何本地工程里的覆盖 jar 里的 mapper.xml 。
class 文件可以在相同路径写个同名的,就能覆盖 jar 里对应的 class 。mapper.xml 文件如何覆盖 jar 里对应的呢。
1249 次点击
所在节点    Java
26 条回复
iv8d
8 天前
没人会吗
pxiphx891
8 天前
为啥要这样搞?解压缩出来再运行呢?
EscYezi
8 天前
两个思路
1. mapper.xml 最后还是要对应到 mapper Interface ,所以应该覆盖 interface 就行了
2. 想办法让 jar 包里的 mapper.xml 不生效,能生效是因为在 mapperScan 的范围内。如果 jar 包里有自动配置让 jar 包内 mapperScan 生效就禁掉对应 bean 的加载;如果没有自动配置直接修改本地工程的 mapperScan 排除 jar 包内(不过不太确定 mapperScan 能不能扫到 jar 内)
kivmi
8 天前
factoryBean.setMapperLocations 不是可以指定 mapper.xml 的路径么?
iv8d
8 天前
@pxiphx891 想覆盖 jar 里 xml 里的功能,由本地自定义
iv8d
8 天前
@kivmi 不会没关系,谢谢
iv8d
8 天前
@EscYezi 可以扫到,目前相当于扫到两次 xml 文件了,导致 bean 冲突。不清楚具体怎么操作
iv8d
8 天前
目前能想到的方案:
1 、解压 jar 修改 xml 后再打包回去,比较麻烦
2 、同路径写一个 xml ,放到 java 路径,目前未生效。
WDATM33
8 天前
说起来之前遇到个奇奇怪怪的 bug ,一个项目里面有两个模块都有独立的 mapper 类和 mapper xml 文件。他们的包路径不一样,mapperLocations 配置如下:
<value>classpath:mybatis/module2/*.xml</value>
<value>classpath:mybatis/module1/*.xml</value>
奇怪的是有时候,这两个位置的 xml 都能正确的加载并且和 mapper 接口映射上。
但是有时候你可能重启一次电脑,这两个路径的 xml 就只有一个能被正确加载映射了。
查询的时候调用对应方法就会提示 无效的绑定。 我至今没找到问题所在,有时候 maven 重新加载一次就又好了
Belmode
8 天前
@WDATM33 #9 这很常见,不是 bug 。jar 被加载的顺序本来就是不固定的,类也是。
WDATM33
8 天前
@Belmode 主要是哪怕顺序不一致 也不应该是有时候两个模块的 xml 都能被加载,有时候却又只能加载其中一个模块的 xml 。
iv8d
8 天前
@WDATM33 资源可能是随机引入的,可能相互间会发生覆盖,漏应该不至于。
WDATM33
8 天前
@iv8d 还真的是漏了, 因为模块 1 和模块 2 都是只有 mapper 接口类和 xml , 这两的 jar 包都是通过引入到模块 3 来起服务的。而模块 1 和模块 2 操作的都是不同的表也不是同名的,不会有覆盖的问题,但是就经常出现上述问题。有时候只会引入模块 1 的文件,有时候只有 2 。有时候开发环境有这个问题,但是生产环境又没事。这玩意真是莫名其妙的,去源码打断点找了一下午没找到原因所在。
iv8d
7 天前
@WDATM33 我猜你用的盗版插件
Belmode
7 天前
@WDATM33 #13 要定位也简单。如果不是经常复现,就写给类把 Mybatis 的配置类 Bean 装配到进去,每次启动打印一下完成的 Mybatis 运行时配置详情,写到日志里,几次输出就能定位了。如果出现频率稍高,几次启停就能出现一次,直接打断点,看一下运行时的 mapper 实例,到底注册的是什么玩意就行了。
siweipancc
7 天前
接口重写方法就行,hook 掉也可以
iv8d
7 天前
@siweipancc 怎么操作呢
siweipancc
7 天前
@iv8d 接口注释覆盖 xml ,这个我忘记优先级是哪个了。或者开个代理 hook 掉 xml 资源加载返回的路径,看下 springaop 的源码怎么玩的,但是你要做的是用 aspectj 。
kivmi
7 天前
@WDATM33 Maven 多模块项目的扫描路径需以 `classpath*`:开头(即加载多个 jar 包下的 XML 文件)是不是需要加*
kivmi
7 天前
@siweipancc 他这个的确只能从 spring 的生命周期入手,不然肯定冲突

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1128440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX