java.lang.NoSuchMethodError: org.apache.ibatis.executor.resultset.ResultSetWrapper.getMappedColumnNames(Lorg/apache/ibatis/mapping/ResultMap;Ljava/lang/String;)Ljava/util/Set; at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.applyPropertyMappings(FlexDefaultResultSetHandler.java:482) at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.getRowValue(FlexDefaultResultSetHandler.java:417) at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.handleRowValuesForSimpleResultMap(FlexDefaultResultSetHandler.java:365) at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.handleRowValues(FlexDefaultResultSetHandler.java:335) at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.handleResultSet(FlexDefaultResultSetHandler.java:306) at com.mybatisflex.core.mybatis.FlexDefaultResultSetHandler.handleResultSets(FlexDefaultResultSetHandler.java:191) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) at com.mybatisflex.core.mybatis.FlexStatementHandler.query(FlexStatementHandler.java:101) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43
那用户提到的是MyBatis-Flex的ResultSetWrapper类,可能这个类在某个版本中添加了getMappedColumnNames方法,而用户当前使用的版本可能比较旧,或者有依赖冲突,导致加载了旧版本的库。另外,也有可能是MyBatis核心库和MyBatis-Flex版本不兼容,因为MyBatis本身可能有自己的ResultSetHandler相关类,如果Flex依赖了特定版本的核心库,而用户项目中用了不同的版本,就可能出现这个问题。
接下来,我需要思考解决方案的步骤。首先应该检查依赖版本是否正确。用户需要确认MyBatis-Flex的版本是否是最新,或者至少是包含这个方法的版本。可能需要查看MyBatis-Flex的官方文档或GitHub仓库的发布说明,看看哪个版本引入了getMappedColumnNames方法。然后,确保项目中所有的相关依赖都统一到兼容的版本,避免因为传递依赖导致旧版本被引入。
另外,Maven的依赖冲突也是一个常见原因。用户可以使用mvn dependency:tree命令来查看依赖树,检查是否有其他库引入了不同版本的MyBatis或MyBatis-Flex,导致冲突。如果有,需要排除掉冲突的依赖,强制使用正确的版本。
清理构建工具缓存也是必要的,比如Maven的本地仓库可能残留旧版本的jar包,导致即使更新了pom.xml,实际编译时还是用了旧版本。清理后重新构建项目可能会解决这个问题。
如果问题依然存在,可能需要检查MyBatis-Flex的配置是否正确,或者是否有自定义的ResultSetHandler实现覆盖了默认的,从而引发问题。另外,查看完整的错误堆栈信息,确认问题发生的具体位置,可能有助于更精准地定位原因。
最后,建议用户查阅MyBatis-Flex的官方文档或社区,看看是否有类似问题的解决方案,或者提交issue寻求帮助。如果用户的环境比较复杂,可能需要逐步排除依赖,确认是哪个库引起了冲突。### 解决方案:MyBatis运行时出现java.lang.NoSuchMethodError: ResultSetWrapper.getMappedColumnNames
的排查与修复
问题分析
该错误通常由以下原因引起:
- 依赖版本不兼容:MyBatis-Flex 的版本与 MyBatis 核心库或其他依赖库版本不匹配,导致
ResultSetWrapper
类缺少getMappedColumnNames
方法[^2]。 - 依赖冲突:项目中存在多个不同版本的 MyBatis 或 MyBatis-Flex 库,导致类加载器加载了旧版本文件。
- 构建工具缓存问题:Maven/Gradle 未正确清理缓存,残留旧版本依赖文件。
解决步骤
1. 检查依赖版本一致性
- 确认 MyBatis-Flex 版本:确保使用支持
ResultSetWrapper.getMappedColumnNames
的版本。例如:<!-- pom.xml 示例 --> <dependency> <groupId>com.mybatis-flex</groupId> <artifactId>mybatis-flex-core</artifactId> <version>1.2.3</version> <!-- 需替换为最新稳定版 --> </dependency>
- 验证 MyBatis 核心库版本:MyBatis-Flex 可能依赖特定 MyBatis 版本。建议使用官方推荐的组合,例如:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency>
2. 排查依赖冲突
- 生成依赖树:通过 Maven 命令定位冲突:
mvn dependency:tree -Dincludes=org.mybatis,com.mybatis-flex
- 排除旧版本依赖:若发现冲突,在
<dependency>
中添加<exclusion>
:<dependency> <groupId>com.other.library</groupId> <artifactId>conflicting-artifact</artifactId> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency>
3. 清理构建缓存
- Maven 清理:
mvn clean install -U
- IDE 清理:在 IntelliJ/Eclipse 中执行
Clean Project
并重启。
4. 验证配置与代码
- 检查 MyBatis 配置:确保
mybatis-config.xml
中未覆盖默认的ResultSetHandler
实现[^2]。 - 简化测试用例:创建一个最小化可复现代码,排除其他组件干扰。
附加说明
- 引用官方文档:MyBatis-Flex 的
ResultSetWrapper
方法变更可能记录在版本更新日志中。 - 社区支持:若问题持续,可在 MyBatis-Flex GitHub Issues 提交详细错误堆栈。
相关推荐


















