问题

公司有一个集成开发平台,导入数据库表会自动生成实体类、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重名问题的更多相关文章

  1. C#显示声名接口就是为了解决方法重名的问题

    class class1 { public static void Main(string[] args) { Person ps = new Person(); ps.KouLan(); IFlya ...

  2. JS重名解决方案

    一个页面如果引用多个JS,或者像ASP.NET MVC,一个视图包含多个子视图,每个子视图有自己的JS,那么变量.函数的重名冲突机会将会大增. 如何解决? 这里有一个方案: 1.用类来封装子页的JS代 ...

  3. 4.4 ROS节点名称重名

    4.4 ROS节点名称重名 场景:ROS 中创建的节点是有名称的,C++初始化节点时通过API:ros::init(argc,argv,"xxxx");来定义节点名称,在Pytho ...

  4. android - 解决“应用自定义权限重名”

    背景 现场的开发今天跟我说,测试包装不上!报错"应用自定义权限重名"!!! 网上百度下关键字,发现魅族手机有这个毛病,顺藤摸瓜:"http://bbs.flyme.cn/ ...

  5. com.google.gson的SerializedName解决实体类与关键字的重名

    使用google的gson包,解决实体类中字段与java关键字的重名: // 比如 当实体类中有switch关键字时,解决冲突如下 @SerializedName("switch" ...

  6. java 实现多个接口 方法重名的解决办法——内部类

    package com.kk.innerClass; /** * 通过内部类实现接口 * 解决多个接口中方法重名问题 * */interface Machine { void run();} clas ...

  7. Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!

    在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常?                      注意:M ...

  8. db2 v9.5迁移至v10.5,及遇重名节点数据库无法创建db的解决办法

    同系统同版本可以使用备份恢复,本文前提是不同系统不同版本,使用db2move命令. 1.db2move db db_name export 此处注意,先建个目录放文件,因为文件比较多,如果上来直接ex ...

  9. MySql 外键重名问题

    在使用mysql workbench 来设计数据库模型时可能一不注意就会出现外键约束重名的情况,并在执行sql语句是会报这样的错误: Error 1022 - Can't write; duplica ...

  10. Django中上传图片---避免因图片重名导致被覆盖

    上一篇文章中(https://www.cnblogs.com/lutt/p/10640412.html),我们以图片文件夹+图片名字的方式来储存图片,这样的做法会导致有重名的图片会导致之前的图片被覆盖 ...

随机推荐

  1. npoi2.3+泛型+反射 根据配置统一解析excel数据到实体的基础方法

    解析方法: /// <summary> /// excel数据解析到实体 /// </summary> /// <typeparam name="T" ...

  2. 学习JavaScript第三天

    文章目录 1.数组 1.1创建数组 1.2数组方法 1.3数组遍历 2.函数 2.1函数的定义 2.2函数的参数以及返回值 2.3函数的作用域 2.4函数传参 3.对象 1.数组 在JavaScrip ...

  3. Mips单周期CPU设计(logisim实现)

    Logisim单周期cpu设计文档与思考题 设计文档 支持指令集 指令 格式 描述(RTL) 机器码 OPCODE/FUNCT add add rd rs rt GPR[rd] <- GPR[r ...

  4. 我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍

    前言 大家好,这里是白泽,拖更了一段时间,抱歉.在 DouTok2.0 可以初步允许大家接入开发之后,这篇文章才得以出炉. DouTok:一个开源的 web 端的短视频应用,采用微服务架构,包含前后端 ...

  5. Power BI如何连接MySQL数据库

    既然写了如何卸载MySQL connector net(相关文章见如何解决MySQL Connector NET xxxx无法卸载的问题(win10)),那就顺便再写一篇Power BI(以下简称PB ...

  6. dorado动态修改数据验证

    view.get("#userDS.dataType").getPropertyDef("unitType").set("required" ...

  7. 【转载】碰碰彭碰彭Jingxuan —— 带中国古筝走上戛纳红毯

    视频地址: https://www.youtube.com/shorts/gl796527H1I

  8. Visual Studio 存在版本之间冲突

    1 . 检查项目中有没有重复引用的包,如果有的话卸掉一个. 2.. 检查项目中引用的包是否自带所重复的包,这样会导致项目之间引发包冲突. 举个例子: 我的项目里ICSharpCode.SharpZip ...

  9. 国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比 四、python读mysql写入达梦数据库

    一.说明 安装达梦的驱动 pip install dmPython==2.5.5 参数接收那里,其他数据库都是用%,达梦要用? 二.源码 #coding=utf-8 import pymysql im ...

  10. 网站统计代码v1.0

    var m = {}; var p ={}; var gifUrl = 'http://hm.iwgame.test/v.gif'; (function() { //参数组合类 m = { ck : ...