欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决:Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for xxx

程序员文章站 2022-07-15 13:05:02
...

 

问题

mybatis启动时报以下错误信息

Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.xxx.xxx.server.mapper.AuthApplicationMapper.BaseResultMap
	at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:930)
	at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:887)
	at org.apache.ibatis.session.Configuration.addResultMap(Configuration.java:644)
	at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:208)
	at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:47)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:289)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:253)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:245)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:118)
	... 71 more

 分析

异常信息来看,意思 是Result Maps collection已经包含  AuthApplicationMapper.BaseResultMap了。就是在启动过程AuthApplicationMapper 存在两个 BaseResultMap

检查了xml代码AuthApplicationMapper.xml,发现只有一个BaseResultMap。按理说是不会报错呀

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.xxx.server.mapper.AuthApplicationMapper">
  <resultMap id="BaseResultMap" type="com.xxx.smlds.model.AuthApplication">
    <[email protected]>
    <[email protected] auth_application-->
    <id column="id" jdbcType="VARCHAR" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="code" jdbcType="VARCHAR" property="code" />
    <result column="is_enable" jdbcType="NUMERIC" property="isEnable" />
    <result column="creator" jdbcType="VARCHAR" property="creator" />
    <result column="create_time" jdbcType="VARCHAR" property="createTime" />
    <result column="modifier" jdbcType="VARCHAR" property="modifier" />
    <result column="modify_time" jdbcType="VARCHAR" property="modifyTime" />
    <result column="icon_default" jdbcType="LONGVARCHAR" property="iconDefault" />
    <result column="icon_selected" jdbcType="LONGVARCHAR" property="iconSelected" />
  </resultMap>
  <sql id="Base_Column_List">
    <[email protected]>
    id, "name", code, is_enable, creator, create_time, modifier, modify_time, icon_default, 
    icon_selected
  </sql>
</mapper>

此时想到,编译运行时肯定肯定两个 AuthApplicationMapper.xml  文件。

经过排查是启动模块依赖的某个模块,也把xml文件外置编译了。如xml文件放在模块A 里, B,C 都依赖A且把xml外置,B又依赖C, 此时B启动时就会报以上错误。

解决

1. B 不依赖C,

2. C不外置xml

名词解释:xml外置

前提: B依赖A

B的pom.xml

   <!--B依赖A, 这里是B模块的pom.xml-->
    <build>
         <resource>
                <!--细粒度控制-->
                <directory>../A模块/src/main/resources</directory>
                <includes>
                    <include>mapper/**Mapper.xml</include>
                </includes>
            </resource>
       </build>



A/pom.xml 

 <!--这里是A 模块的pom.xml-->
 <resources>
            <!--由于顶层应用把mapper.xml外置了,这里不打包进去了,避免冲突。若单独运行则去掉-->
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>mapper/**Mapper.xml</exclude>
                </excludes>
            </resource>
        </resources>