当前位置: 首页 > news >正文

mybatis配置entity下不同文件夹同类型名称的多个类型时启动springboot项目出现TypeException源码分析

记录问题:当配置了 mybatis.type-aliases-package=com.runjing.erp.entity 配置项时,如果entity文件夹下存在不同子文件夹下的同名类型时,mybatis初始化加载映射时会爆出org.apache.ibatis.type.TypeException: The alias 'TestDemo' is already mapped to the value'TestDemo全限定文件路径’ 异常。

问题原因猜测:mybatis加载entity包下的实体类时,会扫描与其转换为非驼峰名称的数据库数据表,当同时出现多个同名称的类型时,别名加载异常,可能维护了一个存储别名的数据结构,如果别名恰巧就是以类型的简单名称为准,就容易导致其他同名的类型别名无法加载完成,爆出异常。

失败措施:起初以为时名称Test与mybatis内置的某个注解或者配置同名异常,全部将名称改为TestDemo后仍然报错。

分析mybatis相关源码:

异常语句打印源码地址:

image.png

image.png

以上代码可以看出在mybatis加载类型别名时,会自动调用别名注册方法,同时存储别名的数据结构是一个Map<String,Class<?>>的map,那么map内部插入一个key相同的键值对是一定不行的。

image.png

我们可发现这里校验了是否已经加载过这个类型,如果加载过,别名存储的数据结构中一定有对应的键值对,那么就会爆出这个异常。

那么mybatis是怎么加载实体类型与对应的别名注册的呢?

我们直接从spring boot对于mybatis的自动配置类上下手:

image.png

经过以上的条件验证后,利用SqlSessionFactoryBean创建一个SqlSessionFactory会话工厂。

image.png

初始加载时,会话工厂应当是空的,所有走向了这个Bean的所谓属性设置后的生命周期方法内部:

image.png

这里也是进行一些数据源,数据会话工厂构造器,数据源配置的相关验证,那么直接进入它构造会话工厂的方法内部:

image.png

方法过于的长,经过我的查看,里面包含有加载数据源、数据库、类型别名、映射Mapper文件、配置文件的代码。与我们这个问题相关的是以上圈起来的代码:

typeAliasesPackage 类型别名包,明显是mybatis配置过的加载实体类型的包路径数据。(注意我们自己在配置文件配置过此类信息

mybatis.type-aliases-package=com.runjing.erp.entity

拿到根路径后自然就是循环遍历里头的各级文件夹,扫描类型别名注册:

configuration.getTypeAliasRegistry().registerAliases(packageToScan,

                typeAliasesSuperType == null ? Object.class : typeAliasesSuperType);

那么我们进入到这个方法的源码里查看下去:

image.png

注册类型别名的方法,继续跟踪:

image.png

扫描有没有使用mybatis的别名注解,如果没有继续调用注册方法,我没用,跟踪下去:

image.png

那么这里显然就是我们出现异常的原因点,问题结束。

http://www.lryc.cn/news/186615.html

相关文章:

  • 淘宝商品评论数据分析接口,淘宝商品评论接口
  • RK3288 android7.1 修改双屏异触usb tp触摸方向
  • 软考 系统架构设计师系列知识点之软件架构风格(8)
  • ubuntu安装ssh
  • webpack不同环境下使用CSS分离插件mini-css-extract-plugin
  • [MongoDB]-权限验证管理
  • bootstrapjs开发环境搭建
  • 远程实时监控管理:5G物联网技术助力配电站管理
  • ubuntu 23.04安装中文输入法
  • java:解析json的几种方式
  • pytorch_神经网络构建1
  • Android 多线程并发详解
  • 系统架构设计:8 论软件架构风格
  • [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
  • Bootstrap中让元素尽可能往父容器的左侧靠近或右侧造近(左浮动和右浮动)
  • 网络流量安全分析-工作组异常
  • Flink之Watermark源码解析
  • 基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真
  • 【微服务】RedisSearch 使用详解
  • 第三章 栈、队列和数组
  • 使用GitLab CI/CD 定时运行Playwright自动化测试用例
  • Suricata + Wireshark离线流量日志分析
  • JMeter基础 —— 使用Badboy录制JMeter脚本!
  • 3D孪生场景搭建:3D漫游
  • 三、综合——计算机应用基础
  • 【Redis】SpringBoot整合redis
  • 竞赛选题 深度学习 python opencv 火焰检测识别 火灾检测
  • Python Parser 因子计算性能简单测试
  • 【java学习】特殊流程控制语句(8)
  • pyinstaller 使用