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

news2024/12/26 15:14:57

记录问题:当配置了 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.coloradmin.cn/o/1073681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么将自己拍摄的视频静音?详细步骤教会你~

大部分人都会遇到的一个问题&#xff0c;我们在拍摄视频时容易将嘈杂的背景音或环境音录进去&#xff0c;怎样解决这个问题呢&#xff1f;今天就来教大家具体操作步骤&#xff0c;只需用到这个软件即可&#xff01; 第一步&#xff1a;打开我们的【音分轨】APP&#xff0c;进入…

山西电力市场日前价格预测【2023-10-10】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-10&#xff09;山西电力市场全天平均日前电价为555.24元/MWh。其中&#xff0c;最高日前电价为1130.92元/MWh&#xff0c;预计出现在18: 30。最低日前电价为293.94元/MWh&#xff0c;预…

网络流量安全分析-工作组异常

在网络中&#xff0c;工作组异常分析具有重要意义。以下是网络中工作组异常分析的几个关键点&#xff1a; 检测网络攻击&#xff1a;网络中的工作组异常可能是由恶意活动引起的&#xff0c;如网络攻击、病毒感染、黑客入侵等。通过对工作组异常的监控和分析&#xff0c;可以快…

【SHUD】SHUD模型Windows下的编译过程

目录 〇、绪论一、SHUD水文模型说明二、SHUD编译1、SUNIALS库的编译1.1. 使用MSVC1.1.1 CMAKE 1.2. 使用MINGW1.2.1 CMAKE1.2.2 生成库文件 2、SHUD的编译过程2.1. LINUX和MAC环境2.2. WINDOWS环境2.2.1 shud2.2.2 shud_omp 〇、绪论 科学模型依据有限时空内的观测&#xff0c…

华为OD机试 - 数字反转打印(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

3D全景虚拟样板间展销系统扩展用户市场范围

VR样板间&#xff0c;能够真实还原现场&#xff0c;定制需要的场景。让一切比真实更真实。用户可以720度看房&#xff0c;自由行走在空间里&#xff0c;直观感受各空间的大小&#xff0c;看到自己家中的“未来样子”&#xff0c;同时通过操控手柄&#xff0c;控制整个智能家居系…

Redis-04独立功能的实现

1、发布与订阅 介绍&#xff1a; Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过SUBSCRIBE命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;成为这些频道的订阅者&#xff08;subscriber&#xff09;每当有其他客户端向被订阅的频道发送消…

API网关是什么?

API网关是什么&#xff1f; API网关很多人都知道它的实现原理&#xff0c;但是并不清楚它存在的意义和背景是什么&#xff0c;这里我给大家通俗易懂地讲解下&#xff01;举个例子&#xff0c;假设你正在开发一个电商网站&#xff0c;那么这里会涉及到很多后端的微服务&#xf…

多个方法多个出路!Microsoft Excel中合并单元格的8种方法

合并单元格是初学者电子表格用户使用的最流行的选项之一。但它们有许多缺点,使它们不是那么好的选择。 在这篇文章中,我将向你展示有关合并单元格的所有信息,包括8种合并单元格的方法。我还将告诉你为什么不应该使用它们,以及一个更好的替代方案,它将产生相同的视觉效果。…

前端预览、下载二进制文件流(png、pdf)

前端请求设置 responseType: “blob” 后台接口返回的文件流如下&#xff1a; 拿到后端返回的文件流后&#xff1a; 预览 <iframe :src"previewUrl" frameborder"0" style"width: 500px; height: 500px;"></iframe>1、预览 v…

【APP】上架指南:iOS App Store 首次上架被拒原因分析与解决方案

目录 一、前言 二、APP 审核备案新规 &#xff08;1&#xff09;iOS 上架审核申请被拒 &#xff08;2&#xff09;苹果应用商店重大调整 &#xff08;3&#xff09;首次备案流程 ① 阿里云备案 ② 华为云备案 ③ 腾讯云备案 三、iOS 首次上架拒审原因分析 &#…

Redis-03持久化

1、RDB持久化 Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含着任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;通常情况下将服务器中的非空数据库以及它们的键值对统称为数据库状态 Redis是内存数据库&#xff0c;它将自己…

【Ingress】

Ingress 一、作用二、使外部应用能够访问集群内服务方案1.NodePort2.LoadBalancer3.externalIPs4.Ingress 三、Ingress的组成1.ingress:nginx配置文件2.ingress-controller: 当作反向代理或者说是转发器 四、Ingress工作原理五、ingress暴露服务的方式方式一&#xff1a;Deploy…

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;没有源代码&#xff0c;你连控件的背景色怎么改都找不着&#xff01;&#xff01; 2.下载你所使用的版本&#x…

Tomcat 线程模型性能调优

Linux I/O模型详解 I/O要解决什么问题 I/O&#xff1a;在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令&#xff0c;数据从外部设备拷贝至内存需要一段时间&#xff0c;这段时间CPU就没事情做了&#xff0c;程序就会两种选择&#xff1a; 让出…

投资 3DEXPERIENCE® WORKS 的 10 大理由

3DEXPERIENCE Works 通过利用基于云的 3DEXPERIENCE 平台提供一个统一的协作环境&#xff0c;扩展 SOLIDWORKS 的价值&#xff0c;使参与 产品开发的每个人都能为创新流程做出贡献。简而言之&#xff0c;如果您喜欢使用 SOLIDWORKS&#xff0c;那么您可以在继续使用的同时&…

在minkube上部署Milvus

Milvus Milvus是一个向量数据库&#xff0c;可以为ai做数据支撑。 Preparatory Work minikube minikube是一款微型本地k8s install curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/loca…

深入理解强化学习——强化学习的定义

分类目录&#xff1a;《深入理解强化学习》总目录 在机器学习领域&#xff0c;有一类任务和人的选择很相似&#xff0c;即序列决策&#xff08;Sequential Decision Making&#xff09;任务。决策和预测任务不同&#xff0c;决策往往会带来“后果”&#xff0c;因此决策者需要为…

电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)

下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&#xff5c;橘猫旗下新概念云平台&#xff0c;取件码&#xff1a;ZdRW 一、软件介绍 AquaSnap(界面增强软件)是一款功能强大的界面增强软件。这款软件支持屏幕边缘吸附与屏幕分屏即多显示器控制、摇晃窗口…

重构项目 vue2 => vue3 nuxt2 => nuxt3 遇到的问题

vue3获取组件的上下文 import { getCurrentInstance } from vue; // 获取当前组件实例 const instance getCurrentInstance();// 获取当前组件的上下文&#xff0c;下面两种方式都能获取到组件的上下文。// 方式一&#xff0c;这种方式只能在开发环境下使用&#xff0c;生产环…