mybatis自定义之优先从classes目录加载,加载之后遇到相同的类定义时不再加载
如果mybatis中包含了两个相同定义的mapper,启动时出现下列异常:
Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.xxx.BaseResultMap
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:872) ~[mybatis-3.4.6.jar!/:3.4.6]
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:844) ~[mybatis-3.4.6.jar!/:3.4.6]
at org.apache.ibatis.session.Configuration.addResultMap(Configuration.java:626) ~[mybatis-3.4.6.jar!/:3.4.6]
at org.apache.ibatis.session.RefreshConfiguration.addResultMap(RefreshConfiguration.java:57) ~[-starter-service-20191118.062118-160.jar:3.4.6]
at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:214) ~[mybatis-3.4.6.jar!/:3.4.6]
at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:47) ~[mybatis-3.4.6.jar!/:3.4.6]
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:285) ~[mybatis-3.4.6.jar!/:?]
原因是mybatis定义的StrictMap加了防覆盖判断,通常的解决方法是检查一遍代码去掉重复的即可。但是LZ有时候需要的场景是为了验证快,临时将mapper修改后不再打包,放在外围的classpath目录优先加载,也就是class的加载顺序机制,而不是重新打包、发包,有时候这甚至不可能。分析源码可知,我们只要在org.apache.ibatis.session.Configuration#addResultMap或org.apache.ibatis.session.Configuration.StrictMap#put加个判断即可。如下:
public V put(String key, V value) { if (containsKey(key)) { // 可以考虑此处加判断,如果已经存在就什么都不做 throw new IllegalArgumentException(name + " already contains value for " + key); } if (key.contains(".")) { final String shortKey = getShortName(key); if (super.get(shortKey) == null) { super.put(shortKey, value); } else { super.put(shortKey, (V) new Ambiguity(shortKey)); } } return super.put(key, value); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2016-12-08 aviator使用手册在线