为什么springboot中的mapper层方法不能重载? mapper[xxx] is ignored, because it exists, maybe from xml file

今天写代码的时候,习惯性的在mapper中写了个重载,如下图

 然后在项目启动时候,居然报错了。报错信息如下。

重载的写法在代码中会经常遇到,为什么到这里就不行了呢?到这里我甚至怀疑我的idea又抽风了 ,先按老规矩重启一下,没效果,那好吧,我们排查一遍。

首先全文搜一下报错信息,搜到了

 点进去瞅瞅发生了什么

 

    /**
     * MybatisPlus 加载 SQL 顺序:
     * 

1、加载 XML中的 SQL

*

2、加载 SqlProvider 中的 SQL

*

3、XmlSql 与 SqlProvider不能包含相同的 SQL

*

调整后的 SQL优先级:XmlSql > sqlProvider > CurdSql

*/ @Override public void addMappedStatement(MappedStatement ms) { if (mappedStatements.containsKey(ms.getId())) { /* * 说明已加载了xml中的节点; 忽略mapper中的 SqlProvider 数据 */ logger.error("mapper[" + ms.getId() + "] is ignored, because it exists, maybe from xml file"); return; } mappedStatements.put(ms.getId(), ms); }

这里用到了一个内存缓存来储存,然后他判断了缓存的key是否重复,从这个代码可以看出来这个可以是什么呢?继续向下看

根据这个程序调用栈我们依次向下找,找到了id,继续向上找,瞅瞅这个id是怎么来的。

 还是这个类,向上翻发现了它的构造方法,第一个属性值为id

为什么springboot中的mapper层方法不能重载? mapper[xxx] is ignored, because it exists, maybe from xml file_第1张图片

好了,现在我们只需要确定是谁调用了这个构造器,继续沿着程序调用栈向下走一步。

为什么springboot中的mapper层方法不能重载? mapper[xxx] is ignored, because it exists, maybe from xml file_第2张图片 找到了它的调用处,这里的变量名改为了 mappedStatementId,我们不要搞混了,记下来继续找mappedStatementId这个属性。

 ok,找到这里就知道这个id是根据什么来命名的了,这个type是从这个类的构造器中取的,就是我们扫描的类名,上图的命名规则为类名+.+方法名。

所以当spring扫描到我们mapper中的方法时,方法的重载会导致MappedStatement 中的key重复,我们还是老老实实的回去改方法名吧。

你可能感兴趣的:(常见问题,spring,boot,java)