Spring Integration与Spring Boot版本不兼容启动报错排查
报错核心是版本不兼容:
你用的Spring Boot 2.3.12.RELEASE 绑定的Spring Framework版本是5.2.15.RELEASE,这个版本的BeanDefinitionBuilder.rootBeanDefinition方法,根本没有Class + Supplier入参的重载——这个重载方法是Spring Framework 5.3.0之后才新增的。
会触发这个调用,说明你实际引入的Spring Integration版本过高。高版本(5.5.x及以上)的Spring Integration是基于Spring 5.3开发的,会直接调用这个新增方法,放到Spring 5.2的环境里跑自然会报方法不存在。
你之前跑依赖树只过滤了spring-beans,没查到核心问题,只要全量打依赖树搜spring-integration-core,肯定能看到实际引入的版本是5.5以上,和Boot 2.3.x不匹配。
二选一即可:
- 方案1(不升级现有Boot版本,改动最小):在pom.xml的
<properties>节点里,手动指定适配Boot 2.3.12的Spring Integration版本,加一行配置:
<spring-integration.version>5.4.13</spring-integration.version>
加完之后执行mvn clean install -U强制刷新依赖,再启动项目就不会报这个错。你当前用的paho mqttv5 1.2.5版本和这个Integration版本完全兼容,不需要调整。
- 方案2(升级Boot版本,用更稳定的2.x终版):直接把parent里的spring-boot-starter-parent版本升到
2.7.18(Spring Boot 2.x的最终稳定版本,依然兼容JDK 1.8),升级后Boot的官方依赖管理会自动拉取匹配的Spring 5.3.x、Spring Integration 5.5.x版本,不需要手动指定任何Integration相关的版本号,直接启动即可。
后续遇到这类方法不存在的依赖冲突,不要只过滤单个依赖,直接执行全量依赖树命令:
mvn dependency:tree
重点核对Spring生态相关组件的版本,只要是用Spring Boot官方parent做依赖管理,所有Spring子项目(Integration、Security、Data等)的版本都不要自己随便指定,用parent管控的版本就不会出兼容问题。
内容的提问来源于stack exchange,提问作者italktothewind

