Spring Boot从1.3.x升级至1.5.9遇ServletRegistrationBean类找不到异常
从你的描述来看,虽然你自己的代码没用到ServletRegistrationBean,但问题肯定出在依赖的构件(尤其是你提到的内部构件)上——它们大概率引入了和Spring Boot 1.5.9不兼容的类或者旧版依赖,导致运行时初始化冲突。下面是几个实用的排查步骤:
先拿到完整的异常栈信息
你只贴了异常开头,这远远不够。一定要把完整的java.lang.IllegalStateException栈打出来,重点看Caused by部分,这里会明确告诉你是哪个类、哪个方法触发的问题,比如是不是某个内部依赖里的代码试图实例化ServletRegistrationBean,或者和Servlet上下文初始化相关的逻辑出了问题。用Maven依赖树揪出冲突
执行这个命令生成完整的依赖树:mvn dependency:tree -Dverbose搜索
ServletRegistrationBean相关的条目,看看哪个构件把它带进来了,同时检查这个构件依赖的Spring Boot版本是不是和1.5.9兼容。另外,重点核对Spring Cloud组件的版本——Edgware确实是兼容1.5.x的,但Brixton太老了,建议直接锁定Edgware的稳定版(比如Edgware.SR5)。逐个排除可疑依赖试错
根据依赖树的结果,尝试给可疑的内部构件添加排除规则,比如如果某个内部构件依赖了旧版的spring-boot-starter-web,就把它排除掉:<dependency> <groupId>你的内部构件groupId</groupId> <artifactId>你的内部构件artifactId</artifactId> <version>对应版本</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </exclusion> </exclusions> </dependency>每次排除后启动项目,看异常是否消失,这样逐步缩小范围,就能找到搞事情的那个构件。
开调试日志抓细节
在application.properties里加上这两行,开启Spring的调试日志:logging.level.org.springframework=DEBUG logging.level.org.springframework.boot=DEBUG启动后重点看Servlet上下文初始化、Bean创建阶段的日志,异常发生前后的日志会告诉你哪个Bean初始化失败,以及这个Bean依赖的类来自哪个Jar包,这对定位依赖问题非常关键。
检查自动配置类的兼容性
Spring Boot 1.5.x的自动配置逻辑和1.3.x有不少变化,有些内部构件可能自定义了自动配置类,这些类在新版本下可能不兼容。你可以用--debug参数启动项目,控制台会输出所有生效的自动配置类,以及哪些类被排除,从中找找有没有异常的配置逻辑。
内容的提问来源于stack exchange,提问作者Gandalf

