![]() |
1
iv8d OP 没人会吗
|
2
pxiphx891 8 天前
为啥要这样搞?解压缩出来再运行呢?
|
![]() |
3
EscYezi 8 天前 via iPhone
两个思路
1. mapper.xml 最后还是要对应到 mapper Interface ,所以应该覆盖 interface 就行了 2. 想办法让 jar 包里的 mapper.xml 不生效,能生效是因为在 mapperScan 的范围内。如果 jar 包里有自动配置让 jar 包内 mapperScan 生效就禁掉对应 bean 的加载;如果没有自动配置直接修改本地工程的 mapperScan 排除 jar 包内(不过不太确定 mapperScan 能不能扫到 jar 内) |
![]() |
4
kivmi 8 天前
factoryBean.setMapperLocations 不是可以指定 mapper.xml 的路径么?
|
![]() |
8
iv8d OP 目前能想到的方案:
1 、解压 jar 修改 xml 后再打包回去,比较麻烦 2 、同路径写一个 xml ,放到 java 路径,目前未生效。 |
9
WDATM33 8 天前
说起来之前遇到个奇奇怪怪的 bug ,一个项目里面有两个模块都有独立的 mapper 类和 mapper xml 文件。他们的包路径不一样,mapperLocations 配置如下:
<value>classpath:mybatis/module2/*.xml</value> <value>classpath:mybatis/module1/*.xml</value> 奇怪的是有时候,这两个位置的 xml 都能正确的加载并且和 mapper 接口映射上。 但是有时候你可能重启一次电脑,这两个路径的 xml 就只有一个能被正确加载映射了。 查询的时候调用对应方法就会提示 无效的绑定。 我至今没找到问题所在,有时候 maven 重新加载一次就又好了 |
13
WDATM33 7 天前
@iv8d 还真的是漏了, 因为模块 1 和模块 2 都是只有 mapper 接口类和 xml , 这两的 jar 包都是通过引入到模块 3 来起服务的。而模块 1 和模块 2 操作的都是不同的表也不是同名的,不会有覆盖的问题,但是就经常出现上述问题。有时候只会引入模块 1 的文件,有时候只有 2 。有时候开发环境有这个问题,但是生产环境又没事。这玩意真是莫名其妙的,去源码打断点找了一下午没找到原因所在。
|
![]() |
15
Belmode 7 天前
@WDATM33 #13 要定位也简单。如果不是经常复现,就写给类把 Mybatis 的配置类 Bean 装配到进去,每次启动打印一下完成的 Mybatis 运行时配置详情,写到日志里,几次输出就能定位了。如果出现频率稍高,几次启停就能出现一次,直接打断点,看一下运行时的 mapper 实例,到底注册的是什么玩意就行了。
|
![]() |
16
siweipancc 7 天前 via iPhone
接口重写方法就行,hook 掉也可以
|
![]() |
17
iv8d OP @siweipancc 怎么操作呢
|
![]() |
18
siweipancc 7 天前 via iPhone
@iv8d 接口注释覆盖 xml ,这个我忘记优先级是哪个了。或者开个代理 hook 掉 xml 资源加载返回的路径,看下 springaop 的源码怎么玩的,但是你要做的是用 aspectj 。
|
![]() |
20
kivmi 7 天前
@siweipancc 他这个的确只能从 spring 的生命周期入手,不然肯定冲突
|
![]() |
21
iv8d OP @siweipancc aop 将注册的 jar 里的 xml 路径换成我的? mapper 扫描时候处理?
|
![]() |
22
siweipancc 6 天前 via iPhone
@iv8d 是的,思路是这个
|
![]() |
23
siweipancc 6 天前 via iPhone
@iv8d 如果扫描器不是 bean ,你要用原生 aspectj
|
![]() |
24
iv8d OP @siweipancc xml 这种咋弄,只弄过方法切面
|
![]() |
25
totoro52 6 天前
mybaits 启动的时候会扫 xml ,在这个时候 hook 就行了
|
26
zengyufei 6 天前
1. classpath: 与 classpath*: 的区别
classpath: 只会加载 第一个 匹配到的资源,按类加载器顺序查找,一旦找到就停止搜索。 classpath*: 会加载所有匹配到的资源,包括 JAR 包内和工程内的,可能导致重复加载导致冲突。 2. 配置 mybatis.mapper-locations 在 Spring Boot 项目中,你可以通过 application.properties (或 application.yml )显式设置: # application.yml mybatis: mapper-locations: - classpath:mapper/local/**/*.xml # 本地优先 - classpath*:mapper/**/*.xml # 备选加载所有(含 JAR ) |