java.lang.IllegalArgumentException: Result Maps collection already contains value for ciis.zht.model

本文介绍了一个常见的MyBatis错误——由于XML配置文件中存在重复的ResultMap而导致的java.lang.IllegalArgumentException异常,并给出了相应的解决办法。

Mybatis报错:java.lang.IllegalArgumentException: Result Maps collection already contains value for ciis.zht.model


这是由于在你的项目中存在一样内容的xml配置文件,删掉重复的就OK

<think>我们正在处理一个MyBatis框架中常见的异常:`java.lang.IllegalArgumentException: Result Maps collection already contains value for ...`。这个异常通常发生在MyBatis加载Mapper XML文件时,发现有两个ResultMap具有相同的id(尽管全限定名可能不同,但MyBatis在映射时只认id)。根据提供的引用信息,我们可以总结出以下几种可能的原因和解决方案: ### 原因分析 1. **重复的ResultMap id**:在同一个Mapper XML文件中,或者多个Mapper XML文件中,定义了相同id的ResultMap。MyBatis不允许ResultMap的id重复(即使在不同Mapper中,因为最终会合并到同一个配置中)[^1][^2][^3][^4]。 2. **MyBatis逆向工程重复生成**:使用MyBatis Generator时,如果多次运行生成代码且没有清理之前的生成结果,可能会导致重复的ResultMap定义[^3][^5]。 3. **XML文件中的重复定义**:可能在一个XML文件中,多次定义了同一个id的ResultMap。 4. **Mapper接口与XML命名空间不一致**:如果Mapper接口的完全限定名与XML中`namespace`属性不一致,也可能导致混乱,但此问题通常会导致其他错误。不过,如果多个XML文件使用了相同的`namespace`,也可能导致冲突。 ### 解决方案 #### 方案1:检查并删除重复的ResultMap定义 - **步骤1**:在项目中全局搜索报错信息中提到的ResultMap id(例如`BaseResultMap`或`deptAndEmpResultMap`)。 - **步骤2**:检查搜索结果,确认是否存在多个同名的ResultMap定义。特别注意不同Mapper XML文件中是否定义了相同id的ResultMap。 - **步骤3**:如果发现重复,保留一个,删除其他重复的ResultMap定义。或者,如果确实需要多个ResultMap,可以修改其中一个的id使其唯一。 #### 方案2:检查MyBatis Generator配置 如果使用了MyBatis Generator逆向生成代码: - **步骤1**:检查生成配置文件中是否有重复的`<table>`配置,或者多次运行生成器而没有清理历史生成文件。 - **步骤2**:按照引用[^5]的建议,在配置表中添加属性以避免重复: ```xml <table tableName="your_table" catalog="your_catalog"> <property name="useActualColumnNames" value="true"/> <property name="ignoreQualifiersAtRuntime" value="true"/> </table> ``` 这些属性可以帮助避免生成重复的ResultMap。 - **步骤3**:在重新生成之前,清理之前生成的所有文件(包括Mapper接口、XML和实体类),然后重新生成。 #### 方案3:检查XML文件的namespace和ResultMap id - **步骤1**:确保每个Mapper XML文件中的`namespace`属性是唯一的,并且对应一个Mapper接口的完全限定名。 - **步骤2**:确保在同一个Mapper XML文件中,所有的ResultMap id都是唯一的。 #### 方案4:检查项目依赖和资源过滤 - **步骤1**:如果项目是Maven项目,检查是否有多个模块包含了相同的Mapper XML文件?确保构建过程中没有重复复制资源文件。 - **步骤2**:检查Maven资源过滤配置,确保`src/main/resources`目录下的XML文件被正确复制到`target/classes`,并且没有重复。 ### 预防措施 1. **命名规范**:为ResultMap id使用有意义的唯一名称,例如可以加上模块前缀(如`User_BaseResultMap`)。 2. **代码生成管理**:使用版本控制管理生成的文件,并在重新生成前先删除旧文件。 3. **代码审查**:在团队开发中,代码审查时注意检查Mapper XML文件的唯一性。 §§相关问题§§ 1. MyBatisResultMap的作用是什么? 2. 如何配置MyBatis Generator以避免生成重复的ResultMap? 3.MyBatis中,除了ResultMap重复,还有哪些常见的配置错误会导致异常? </think>### 解决 `java.lang.IllegalArgumentException: Result Maps collection already contains value for` 异常的方法 该异常是 MyBatis 框架的常见错误,表示 **同一个 ResultMap ID 被重复定义**,通常由以下原因导致: #### ✅ 根本原因 1. **重复的 ResultMap ID** 在 MyBatis 的 XML 映射文件中,多个 `<resultMap>` 使用了相同的 `id` 属性值(即使在不同文件中,只要 ID 相同就会冲突)[^1][^3][^4]。 2. **MyBatis Generator 配置问题** 使用逆向工程工具生成代码时: - 未清理旧文件导致重复生成 - 配置错误(如表名大小写不一致)[^5] 3. **XML 文件合并冲突** Maven/Gradle 构建时可能重复包含 XML 文件(如 `src/main/resources` 和 `target` 目录冲突)[^4]。 --- #### 解决方案(按优先级排序) ##### 1. **检查重复的 ResultMap ID** ```xml <!-- DeptMapper.xml --> <resultMap id="BaseResultMap" type="Dept"> ... </resultMap> ❌ 重复ID <!-- EmployeeMapper.xml --> <resultMap id="BaseResultMap" type="Employee"> ... </resultMap> ❌ 同名冲突 ``` **修复**: - 全局搜索 `BaseResultMap`(或报错中的 ResultMap 名称) - 修改其中一个为唯一 ID,例如: ```xml <resultMap id="EmployeeResultMap" ...> ... </resultMap> ✅ ``` ##### 2. **MyBatis Generator 优化配置** 在逆向工程的 `generatorConfig.xml` 中添加: ```xml <table tableName="your_table"> <!-- 关键配置:避免重复生成 --> <property name="useActualColumnNames" value="true"/> <property name="ignoreQualifiersAtRuntime" value="true"/> [^5] </table> ``` **操作步骤**: 1. 删除所有已生成的 Mapper/XML 文件 2. 添加上述配置后重新生成代码 3. 确保表名在配置中保持**大小写一致** ##### 3. 检查 XML 文件包含冲突 ```markdown 项目结构: src/main/resources ├─ com/example/mapper/DeptMapper.xml ❌ target/classes └─ com/example/mapper/DeptMapper.xml ❌ 重复被加载 ``` **修复**: - 清理构建目录(`mvn clean` / `gradle clean`) - 检查资源过滤配置,避免 XML 文件被复制多次 ##### 4. 核对命名空间 (namespace) ```xml <!-- 正确示例 --> <mapper namespace="com.example.dao.DeptMapper"> ✅ ``` 确保每个 Mapper.xml 的 `namespace` 属性**全局唯一**,且与接口全限定名一致[^4]。 --- #### 🔍 调试建议 1. **日志分析** 开启 MyBatis 完整日志(在 `log4j.properties` 中添加): ```properties log4j.logger.org.mybatis=DEBUG ``` 查看加载了哪些重复的 XML 文件。 2. **IDEA 全局搜索** 快捷键 `Ctrl+Shift+F` 搜索报错中的 ResultMap 名称(如 `BaseResultMap`),定位所有定义点。 3. **注解冲突检查** 若同时使用 XML 和注解配置: ```java @Results(id = "BaseResultMap", value = { ... }) ❌ 与XML冲突 ``` 需保持 XML 或注解二选一。 --- #### 💡 预防措施 - **命名规范**:为 ResultMap 添加模块前缀(如 `User_BaseResultMap`) - **生成器配置**:每次生成前清理旧文件 - **构建检查**:在 `pom.xml` 中配置资源过滤: ```xml <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 排除已编译的XML --> <excludes> <exclude>**/*Mapper.xml</exclude> </excludes> </resource> </resources> ``` > 通过以上方法可解决 95% 的此类异常。若仍出现,需检查项目依赖中是否包含重复的 MyBatis 模块(如多版本冲突)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值