Spring升级后报NoSuchMethodError: CollectionUtils.newLinkedHashMap缺失
问题根因
这个报错是版本升级后典型的Spring依赖版本错位问题,核心逻辑链路:
- 报错中提到的
org.springframework.util.CollectionUtils#newLinkedHashMap(int)静态方法,归属spring-core模块,是Spring Framework 5.3.0版本才新增的方法,5.2.x及更早版本的CollectionUtils类中完全不存在这个方法签名。 - 你代码中调用的
jdbcTemplate.call(...)属于spring-jdbc模块的实现逻辑,如果运行时加载的spring-jdbc版本在5.3.0及以上,其内部JdbcTemplate.call方法会主动调用上述newLinkedHashMap来初始化存储过程调用的参数元数据Map。 - 当类路径下实际加载的
spring-core版本低于5.3.0时,JVM在执行到上述调用逻辑时找不到目标方法,就会抛出NoSuchMethodError;由于异常是在你调用jdbcTemplate.call的栈帧中抛出的,报错堆栈会直接指向你写的业务代码行。你代码中传入的new ArrayList<>()和这个报错没有任何关联,不需要修改业务逻辑排查方向。
排查与解决方向
- 第一步:确认运行时实际加载的类版本
直接在应用启动逻辑中加一段临时打印代码,定位两个类的真实加载来源:
对比输出路径对应的jar包版本,可直接验证是否存在错位:如果System.out.println("CollectionUtils加载路径: " + CollectionUtils.class.getResource("/org/springframework/util/CollectionUtils.class")); System.out.println("JdbcTemplate加载路径: " + JdbcTemplate.class.getResource("/org/springframework/jdbc/core/JdbcTemplate.class"));JdbcTemplate来自5.3.x的spring-jdbc包、CollectionUtils来自5.2.x及更早的spring-core包,即可100%确认是版本冲突。 - 第二步:梳理依赖树定位版本偏移来源
Maven项目执行mvn dependency:tree -Dincludes=org.springframework,Gradle项目执行gradle dependencies --configuration runtimeClasspath,重点排查两类问题:- 版本升级时只单独替换了spring-jdbc、spring-boot-starter-jdbc等个别模块,没有对齐spring-core、spring-context等其他Spring核心模块的版本
- 存在老旧的第三方间接依赖,强制引入了低版本的spring-core,覆盖了你预期配置的高版本依赖
- 第三步:按实际场景修复冲突
- 优先通过Spring Boot官方BOM统一管理所有Spring相关组件的版本,避免零散配置单个模块版本导致的兼容性问题
- 对强制引入低版本spring-core的间接依赖,通过依赖排除规则将低版本spring-core从传递依赖中剔除
- 如果项目暂时无法将spring-core升级到5.3.0及以上版本,同步将spring-jdbc版本降级到和当前spring-core匹配的5.2.x及更低版本,消除版本错位
内容的提问来源于stack exchange,提问作者JGleason
相关产品推荐
相关产品推荐

