首页 > 其他分享 >解决mapper重名问题

解决mapper重名问题

时间:2024-12-05 22:44:24浏览次数:6  
标签:mapper definition 重名 全类 nameGenerator 文件 解决 generatedBeanName

问题

公司有一个集成开发平台,导入数据库表会自动生成实体类、mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作。

但是最近我在使用这个平台的时候遇到了一个问题,那就是mapper冲突问题。当老表进行导入的时候,会生成与之前项目中已有mapper一样的名字,比如原项目中有个PersonMapper.java的文件,导入后就会有两个PersonMapper.java,这样就会冲突报错,导致项目无法启动。

怎么解决呢?将原先的mapper命名进行修改?显然是不现实的,也违背了开放封闭原则。

原因

首先需要明确,为什么两个一样命名的mapper文件会冲突,因为在在进行对象注入的时候,@Mapper在生成beanName的时候默认把首字母小写之后返回类名,如果存在两个命名完全一样的文件返回的beanName也是一样的,因此@Resource会不知道注入哪一个从而冲突。

清楚原因后,要做的就是当注入的时候怎么区分这两个mapper文件,进行不同的注入。

解决

在思考一番后,决定使用@MapperScan去解决这个问题,核心在于使用其中的nameGenerator字段。

@MapperScan中的nameGenerator继承于BeanNameGenerator
mmct_namegenerator
而在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,definition,重名,全类,nameGenerator,文件,解决,generatedBeanName
From: https://www.cnblogs.com/lemondu/p/18589583

相关文章

  • 电商项目-跨域解决方案CORS
    一、什么是跨域出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略......
  • 使用Chocolatey打包MSI软件包的完整解决方案及技术总结
    使用Chocolatey打包MSI软件包的完整解决方案及技术总结在Windows系统上使用Chocolatey管理软件包是一种高效且自动化的方式,尤其是针对MSI格式的软件包。然而,在实际操作中,我们可能会遇到各种问题,例如检测旧版本、卸载旧版本以及处理多个匹配记录等。本文将详细记录从问题发......
  • WRF报错Land Use Dataset ‘‘ not found in VEGPARM.TBL. 解决方案(MATLAB版)
    #WRF模式LandUseDataset''notfoundinVEGPARM.TBL.报错情况最近在使用WRF(-Chem)v4.4.2时,因为需要进行化学场的spinup,涉及到使用之前模拟的结果作为模拟的初始(化学)场,前面real等步骤的执行都无异样,但是正式运行wrf.exe时,很快就出现了停止,查询rsl.erro.0000,出现如下报......
  • Profinet转EtherNet/IP网关是如何解决西门子S7-1500PLC与AB PLC的通讯问题的
    一、案例背景在一个工业现场,一端是AB的PLC,IP地址192.168.1.20;另一端西门子是S7-1500系列,IP地址192.168.2.248。AB的PLC内有B3、N7、F8三个寄存器文件涉及到通讯,分别对应西门子PLC的M、DB1、DB2三个存储区域。通过捷米特网关的参数设置软件进行配置,配置完成后下载重启,再......
  • Profibus DP转Profinet网关解决称重仪表与西门子1200PLC的通讯案例
    一、案例背景客户现场有40多台ProfibusDP协议的称重。现需要把这些仪表统一接到西门子1200PLC上面,并进行实时监控。通过使用捷米特JM-DPM-PN网关将两边的设备进行连接。DP从站和西门子PLC配置完成后下载重启,读取参数后根据实时状态进行调试。二.设备介绍1.西门子12......
  • 你能谈谈HashMap怎样解决hash冲突吗?
    HashMap冲突解决方法比较考验一个开发者解决问题的能力。下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMa......
  • mybatis Integer字段值传0,判断不等于空字符串,识别成空字符串排查解决
    mybatisInteger字段值传0,判断不等于空字符串,识别成空字符串排查解决根本原因:mybatis将传入的Integer类型的0被识别成空字符串在mbatis中使用Xml配置sql语句时,出现了这样一个问题。入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误。insertinto......
  • 【低代码】低代码平台协同&敏捷场景下的并行开发解决方案探索
    低代码开发平台的出现,大大地提高的产品交付效率,但是在协同开发、敏捷迭代的场景下,也暴露出了一些问题。例如:多人同时对项目进行修改,相互影响甚至修改内容被互相覆盖;同一项目下多个需求同步开发,但需求上线日期不统一,无法拆分上线等等。本文将根据不同诉求,渐进式的讨论......
  • 利用自监督学习解决二级类中出现的长尾问题
    文章目录概要自监督学习知识蒸馏自监督+知识蒸馏核心代码相关文献概要为了提高机械臂采摘苹果的效率,需要对可采摘苹果进行精准识别。通过对苹果、树叶、树枝以及它们之间的空间关系进行细致分析,我们将苹果识别问题细分为八个类别,由此引发了类别间数量严重不......
  • 虚拟机(VM)鸿蒙开发软件(DevEco Studio)不能同时使用Hyper-v/解决未开启Hyper-V,开启Hy
    目录问题一:方法:问题二:方法:问题三:方法:解决你的问题,先看问题三,如果没有问题三,再看问题一二!!!!!!问题一:如果你同时用虚拟机(VMware)和鸿蒙开发软件(DevEcoStudio),你在解决了我下面说的问题三后,虚拟机不能用了,显示:解决VMwareWorkstation与Hyper-V不兼容。请先从系......