Result Maps collection already contains value for问题

目录

项目场景:

问题描述:

原因分析:

解决方案:

步骤:

特殊情况:


项目场景:

Spring Boot+Mybatis项目

问题描述:

使用IDEA启动的时候报错了,异常信息:

Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [D:...\target\classes\biz-sql\oracle\mapper\PubParamWorkListOraMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.xxx.mapper.xxx.PubParamWorkListMapper.BaseResultMap

 Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.xxx.mapper.workflow.PubParamWorkListMapper.BaseResultMap
    at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:872)
    at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:844)
    at org.apache.ibatis.session.Configuration.addResultMap(Configuration.java:626)
    at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:214)
    at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:47)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:285)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:252)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:244)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:116)
    ... 58 common frames omitted

原因分析:

异常信息提示了在Mybatis的所有配置文件里,存在着同样名称空间重复id设置,其中一个配置是PubParamWorkListOraMapper.xml里的BaseResultMap。

关于这个错误,已经有很多文章分析了原因,比如:

1、当同一个xml映射文件内存在两个相同的id(即两个sql语句的id相同)时会报此错

解决:查询sql语句的id值修改

2、在mybatis的配置文件mybatis.xml内使用了<mapper/>标签加载xxxMapper.xml的映射文件报错,因为如果xxxMapper.xml与namespace的接口在同一路径下,就不需要在mybaits.xml中再进行配置了。

解决:将mybatis文件中<mapper/>标签中的内容删除

3、parameterType中的问题。这里的类名如果找不到也会报这个错,比如你之前是将该类名写死在这里,之后由于重构将该类转移到其他包中,如果这里不修改也会报这个错

解决:检查。。

4、还是parameterType中的问题,这次是关于自定义类的,当你使用基本类型的时候,比如int、string等,千万不要写错,比如写成strnig,咋一看看不出来,结果该问题就很难找

解决:检查。。

5、resultType的值与resultMap的id值相同的话会报错,可能是冲突了

解决:修改resultMap的id属性,因为resultType的值即为bean类别名或者全路径名

6、这一点和上一点差不多,如果是自定义resultMap,如果返回类型写成resultType,也会报这个错(今天就栽在这。)

解决:将返回类型改为resultMap,且不要出现第5点的问题

7. 配置的时候generatorConfig.xml(我的逆向工程配置文件名),里面的schema没有指定,如果没有指定的话,本地存在多个相同名字的表的话,逆向工程会自己去找名字叫t_user的这张表,也就可能导致生成了错误的bean。然后就会产生上面的问题。一定不要忘了指定。 我本地有三张叫t_user的表,忘了指定schema,就生成了错误的bean。

<table schema="ssmteam"  tableName="t_user"  domainObjectName="User"> </table>

解决方案:

步骤:

1.打开异常信息里提示出现异常的文件PubParamWorkListOraMapper.xml,查看文件里是否有重复的id:BaseResultMap

2.全局查找PubParamWorkListOraMapper.xml里的名称空间,看是否在其它配置文件里也配置了同样的名称空间

3.全局查找PubParamWorkListOraMapper.xml文件,看是否有多个工程的配置文件里都配置了这个文件

4.按照解决步骤上方的原因分析逐项排查

5.在文件系统里搜索PubParamWorkListOraMapper.xml文件,看该工程及其子工程的编译路径如target里有是否有多个这个文件,导致系统启动的时候,多次加载了这个文件。

(如果是windows系统,可以用everything来快速搜索文件)

大部分情况下,1到4步骤,就可以解决问题了。

特殊情况:

本次的场景比较特殊,在第5步才解决:

        原本PubParamWorkListOraMapper.xml这个文件在A工程里,同事将PubParamWorkListOraMapper.xml文件移动到了B工程里。我更新了代码之后,使用IDEA启动就报了文章开头的错误。原因是更新完代码之后,IDEA没有自动重新编译A工程,A工程的target目录下还保留着原来的PubParamWorkListOraMapper.xml文件,而B工程的target里也有这个文件,启动的时候就报了Result Maps collection already contains value for的错。

参考:

关于mybatis启动报Result Maps collection already contains value for ...的问题总结_Evan's Blog ٩(๑❛ᴗ❛๑)۶-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值