升级Spring Boot3.x/Spring6.x后handlerExceptionResolver Bean创建异常求助
问题
我的应用同时使用Spring Boot和Spring依赖,因spring-web存在安全漏洞,需从5.3.33升级至6.x版本。此前使用Spring Boot 2.7.18(基于Spring Framework 5.x)。
已完成以下操作:
- 将项目从Java 11升级至Java 17
- 在pom.xml中把Spring Boot starter parent及具体版本从2.7.18改为3.2.0
- 将spring-web从5.3.33升级至6.0.19
- 修复了构建过程指出的版本兼容性代码问题
执行mvn spring-boot:run命令时,项目构建成功但无法启动,报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'handlerExceptionResolver' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception with message: org/springframework/web/util/DisconnectedClientHelper
搜索及相关建议让修复项目内的handlerExceptionResolver实现,但我并未实现该类。
完整堆栈信息:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'handlerExceptionResolver' defined in class path resource [org/springframework/boot/autoconfigure /web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception with message: org/springframework/web/util/DisconnectedClientHelper at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:643) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1166) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946) ~[spring-context-6.1.1.jar:6.1.1] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) ~[spring-context-6.1.1.jar:6.1.1] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) [spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) [spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) [spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1342) [spring-boot-3.2.0.jar:3.2.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1331) [spring-boot-3.2.0.jar:3.2.0] at com.verint.useragentservice.UseragentServiceApplication.main(UseragentServiceApplication.java:16) [classes/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) [spring-boot-devtools-3.2.0.jar:3.2.0] Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception with message: org/springframework/web/util/DisconnectedClientHelper at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:178) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-6.1.1.jar:6.1.1] ... 24 more Caused by: java.lang.NoClassDefFoundError: org/springframework/web/util/DisconnectedClientHelper at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.<clinit>(ExceptionHandlerExceptionResolver.java:87) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.createExceptionHandlerExceptionResolver(WebMvcConfigurationSupport.java:1079) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.createExceptionHandlerExceptionResolver(WebMvcAutoConfiguration.java:554) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addDefaultHandlerExceptionResolvers(WebMvcConfigurationSupport.java:1051) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.handlerExceptionResolver(WebMvcConfigurationSupport.java:1005) ~[spring-webmvc-6.1.1.jar:6.1.1] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-6.1.1.jar:6.1.1] ... 24 more Caused by: java.lang.ClassNotFoundException: org.springframework.web.util.DisconnectedClientHelper at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?] at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.<clinit>(ExceptionHandlerExceptionResolver.java:87) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.createExceptionHandlerExceptionResolver(WebMvcConfigurationSupport.java:1079) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.createExceptionHandlerExceptionResolver(WebMvcConfigurationSupport.java:554) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addDefaultHandlerExceptionResolvers(WebMvcConfigurationSupport.java:1051) ~[spring-webmvc-6.1.1.jar:6.1.1] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.handlerExceptionResolver(WebMvcConfigurationSupport.java:1005) ~[spring-webmvc-6.1.1.jar:6.1.1] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.1.jar:6.1.1] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-6.1.1.jar:6.1.1] ... 24 more
解决方案
问题原因
Spring Boot 3.2.0默认依赖的Spring Framework版本是6.1.x(从堆栈中的spring-webmvc-6.1.1.jar可确认),但你手动指定了spring-web的版本为6.0.19,导致Spring模块版本不兼容。DisconnectedClientHelper是Spring Framework 6.1.x新增的类,spring-webmvc 6.1.1在初始化时需要这个类,但spring-web 6.0.19中不存在该类,从而触发NoClassDefFoundError,最终导致handlerExceptionResolver bean创建失败。
修复步骤
- 移除手动指定的spring-web版本:在pom.xml中删除对
spring-web的版本声明,让Spring Boot的parent依赖管理自动维护所有Spring模块的兼容版本。 - 清理并重新构建项目:执行以下命令,确保本地仓库中的依赖都是匹配的版本:
mvn clean install - 重新启动项目:再次执行启动命令:
mvn spring-boot:run
注意事项
Spring Boot的starter parent已经为所有Spring核心模块维护了经过验证的兼容版本,手动指定单个模块的版本极易引发版本冲突。后续升级时,优先通过调整Spring Boot版本来同步所有Spring Framework依赖的版本,避免手动指定单个模块版本。
内容的提问来源于stack exchange,提问作者Tonesz586
相关产品推荐
相关产品推荐

