java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mapper.AaM

下面是完整的故障码:

Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mapper.AaMapper.BaseResultMap
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:120)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:92)
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:521)
	... 85 more
Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mapper.AaMapper.BaseResultMap
	at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:859)
	at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:831)
	at org.apache.ibatis.session.Configuration.addResultMap(Configuration.java:613)
	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)
	... 87 more

从中提取的关键词是“ibatis”,“already contains”,“com.mapper.AaMapper.BaseResultMap”,其中“ibatis”是“mybatis”以前的名称,也就是说该故障码报的错误是在mybatis中有名为“AaMapper”的xml文件重复了(注:BaseResultMap只可能存在于mybatis的xml文件中),我记得上次我运行该项目时是好好地,并没有什么问题,之后我也仅仅是注释了一些代码,然后很快的又还原了,怎么就错了呢?于是我还是搜索了一遍,没有发现重复,又重复了几次这种操作,问题仍然存在,后来我想到,在maven项目中,程序执行时其实是查找的“target”文件夹下已经编译好的.class以及其它的资源文件,所以说我又在“target”文件夹下查找,果然,其搜索结果如下:



由于“target”文件夹下的内容,每次重新编译项目的时候都会自动生成,所以说我们对这里采取的操作是,直接将其删掉就可以了。


其实光删掉本身并不能解决根本性的问题,因为每次运行时,它们还是会自动生成的,也就是说这样做是徒劳的。

再仔细分析,默认的,在target文件夹下是会生成一份“classes”源码信息,同时idea也会自动在target下生成一份对应的项目目录结构,这样不可避免的就会造成双份编译文件的情况,如下所示:


所以说项目运行出错,那就只能是项目本身在运行时找到了双份,然后程序不知道该用哪个才对,这样,我们只要是将其中的一份排除就行了,而根据上面的分析,出错地点是在mybatis,所以说很自然的我们会找到mybatis扫描xml文件的配置地址,然后,我在这里发现了双份信息,如下:

<property name="mapperLocations" value="classpath*:com/mapper/*.xml" />
<!--<property name="mapperLocations" value="classpath:com/mapper/*.xml" />-->


在这里,我们把第一个注释掉,将第二个打开,OK,一切搞定!


其实在这里我之所以会写上两个,然后做一下比较,是因为我发现他们之间就一个星号的差别,但是程序就仅仅是因为这一小小的差别而不能运行,并且该问题还不是很容易被察觉,因为mybatis的故障码本身就不是很准确,所以说这也为查找问题带来了一定的麻烦,而我正因为意识到这一点,所以说才写下上述代码的。后来在做其它测试时频繁的打开,注释不同的代码块,然后又将该项目放置了几天,以至于到后来反倒由于不合理的注释把自己都给坑了。。。


最后再说明一下,“classpath*”代表的是当target文件夹下存在多个“classes”文件夹时,同时使用多个,而“classpath”代表的是当“target”文件夹下存在多个“classes”文件夹时,默认只使用第一个,这样采用“classpath”才能真正解决上述问题。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值