解决mapper重名问题
问题
公司有一个集成开发平台,导入数据库表会自动生成实体类、mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作。
但是最近我在使用这个平台的时候遇到了一个问题,那就是mapper冲突问题。当老表进行导入的时候,会生成与之前项目中已有mapper一样的名字,比如原项目中有个PersonMapper.java的文件,导入后就会有两个PersonMapper.java,这样就会冲突报错,导致项目无法启动。
怎么解决呢?将原先的mapper命名进行修改?显然是不现实的,也违背了开放封闭原则。
原因
首先需要明确,为什么两个一样命名的mapper文件会冲突,因为在在进行对象注入的时候,@Mapper在生成beanName的时候默认把首字母小写之后返回类名,如果存在两个命名完全一样的文件返回的beanName也是一样的,因此@Resource会不知道注入哪一个从而冲突。
清楚原因后,要做的就是当注入的时候怎么区分这两个mapper文件,进行不同的注入。
解决
在思考一番后,决定使用@MapperScan去解决这个问题,核心在于使用其中的nameGenerator字段。
@MapperScan中的nameGenerator继承于BeanNameGenerator

而在Spring的容器中,是使用BeanNameGenerator去命名检测到的组件,可以通过重写nameGenerator方法去重命名检测到的组件,具体解决代码如下所示:
@Configuration
@MapperScan(
value = {"xxx", "xxx"},
sqlSessionFactoryRef = "sqlSessionFactory",
nameGenerator = ComposerNameGenerator.class
)
public class ComposerNameGenerator implements BeanNameGenerator {
public ComposerNameGenerator() {
}
// definition 是被生成名字的BeanDefinition实例;
// registry是生成名字后注册进的BeanDefinitionRegistry。
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
// 拿到Bean定义信息里面的BeanClassName全类名
// 注意这个不是必须的,因为如果是继承关系,配上父类的依旧行了
String generatedBeanName = definition.getBeanClassName();
if (generatedBeanName == null) {
// 若没有配置本类全类名,去拿到父类的全类名+$child"俩表示自己
if (definition.getParentName() != null) {
generatedBeanName = definition.getParentName() + "$child";
}
// 工厂Bean的 就用方法的名字+"$created"
else if (definition.getFactoryBeanName() != null) {
generatedBeanName = definition.getFactoryBeanName() + "$created";
}
}
// 若一个都没找到,抛错
if (!StringUtils.hasText(generatedBeanName)) {
throw new BeanDefinitionStoreException("Unnamed bean definition specifies neither 'class' nor 'parent' nor 'factory-bean' - can't generate bean name");
} else {
return generatedBeanName;
}
}
}
这样配置后,即使是一样命名的mapper文件,只要不在同一个包中依旧可以正常注入。
解决mapper重名问题的更多相关文章
- C#显示声名接口就是为了解决方法重名的问题
class class1 { public static void Main(string[] args) { Person ps = new Person(); ps.KouLan(); IFlya ...
- JS重名解决方案
一个页面如果引用多个JS,或者像ASP.NET MVC,一个视图包含多个子视图,每个子视图有自己的JS,那么变量.函数的重名冲突机会将会大增. 如何解决? 这里有一个方案: 1.用类来封装子页的JS代 ...
- 4.4 ROS节点名称重名
4.4 ROS节点名称重名 场景:ROS 中创建的节点是有名称的,C++初始化节点时通过API:ros::init(argc,argv,"xxxx");来定义节点名称,在Pytho ...
- android - 解决“应用自定义权限重名”
背景 现场的开发今天跟我说,测试包装不上!报错"应用自定义权限重名"!!! 网上百度下关键字,发现魅族手机有这个毛病,顺藤摸瓜:"http://bbs.flyme.cn/ ...
- com.google.gson的SerializedName解决实体类与关键字的重名
使用google的gson包,解决实体类中字段与java关键字的重名: // 比如 当实体类中有switch关键字时,解决冲突如下 @SerializedName("switch" ...
- java 实现多个接口 方法重名的解决办法——内部类
package com.kk.innerClass; /** * 通过内部类实现接口 * 解决多个接口中方法重名问题 * */interface Machine { void run();} clas ...
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- db2 v9.5迁移至v10.5,及遇重名节点数据库无法创建db的解决办法
同系统同版本可以使用备份恢复,本文前提是不同系统不同版本,使用db2move命令. 1.db2move db db_name export 此处注意,先建个目录放文件,因为文件比较多,如果上来直接ex ...
- MySql 外键重名问题
在使用mysql workbench 来设计数据库模型时可能一不注意就会出现外键约束重名的情况,并在执行sql语句是会报这样的错误: Error 1022 - Can't write; duplica ...
- Django中上传图片---避免因图片重名导致被覆盖
上一篇文章中(https://www.cnblogs.com/lutt/p/10640412.html),我们以图片文件夹+图片名字的方式来储存图片,这样的做法会导致有重名的图片会导致之前的图片被覆盖 ...
随机推荐
- CMDB实践指南:项目规划与实施策略解析
随着现代企业IT系统的日益复杂,如何有效管理这些庞大的IT资产和资源,成为每个企业必须面对的重要问题.CMDB应运而生,帮助企业集中管理IT资源,维护系统的稳定性,并支持故障排查与决策制定.本文将深入 ...
- Java高并发关于synchronized的8锁讲解
先了解一个概念:synchronized 锁的是这个方法所在的资源类,就是这个对象,也就是同一时间段不可能有两个线程同时进到这个资源类,同一时间段,只允许有一个线程访问资源类里面的其中一个synchr ...
- C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 看图认识CSS
教程: https://www.w3cschool.cn/css/ https://www.runoob.com/css/css-tutorial.html https://www.w3school. ...
- 使用PYNQ生成PWM波控制舵机/步进电机/机械臂
使用PYNQ生成PWM波控制舵机/步进电机/机械臂 在开始这个工程之前,你需要PYNQ-Z2的板卡文件,约束文件,原理图作为参考,你可以在我上传的资源里下载. 当然,这个工程也适用于PYNQ-Z1,只 ...
- 基于Java+SpringBoot心理测评心理测试系统功能实现七
一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...
- manim边做边学--圆锥
Cone是Manim中专门用于创建和操控锥形几何对象的类. Cone允许用户定义锥体的底面半径.高度.颜色.不透明度等属性,并提供了一系列方法来操控这个锥体,如移动.缩放.旋转等. 通过这些属性和方法 ...
- 基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
前言 今天大姚给大家分享一个基于C#开源.功能强大.灵活的跨平台开发框架:Uno Platform.通过 Uno Platform,开发者可以利用单一代码库实现多平台兼容,极大地提高了开发效率和代码复 ...
- 深度解析:Air780E模组之SIM卡接口电路的设计原理
SIM卡接口用于连接SIM卡并读取SIM卡信息,以便在注册4G网络时进行鉴权身份验证,是4G通信系统的必要功能. 合宙低功耗4G模组经典型号Air780E支持两路SIM卡,支持双卡切换,便于设备灵 ...
- 条理清晰,浅显易懂:Lua语法基础知识(第二部分)
今天我们继续学习Lua语法基础教程,中篇. 五.变量 5.1 number变量 变量,可以看作是一个桶,在里面装你想要装的内容.这些内容可以是Lua包含的所有合法类型. 例如:我想要新建一个桶,名叫b ...