Spring MVC运行报Constructor threw exception错误如何解决
问题根因
你遇到的报错确实是Spring依赖版本不一致导致的:
- 你引入的
spring-webmvc版本为5.3.10,该版本中BeanNameUrlHandlerMapping初始化需要调用org.springframework.core.log.LogDelegateFactory.getHiddenLog()方法,这个方法是Spring 5.3版本新增的API - 但你的
spring-context、spring-beans版本为5.2.17.RELEASE,对应版本的Spring核心包中没有这个方法,所以运行时抛出NoSuchMethodError异常。
你虽然配置了spring-framework-bom做版本统一,但两个配置问题导致bom未生效:一是你给每个Spring依赖单独硬编码了版本号,优先级高于bom管理;二是bom的版本变量${spring.version}没有赋值,无法起到统一版本的作用。
修复步骤
- 统一Spring所有依赖版本
要么所有Spring组件都用5.2.x版本,要么都升级到5.3.x版本,这里推荐统一用5.3.10版本,修改pom.xml配置:
首先给${spring.version}赋值,然后移除所有Spring依赖下单独写的version标签,交给bom统一管理:
<!-- 在properties节点新增版本配置 --> <properties> <spring.version>5.3.10</spring.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 移除所有Spring依赖的version标签 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>
- 修正Controller返回的视图名
你已经在视图解析器中配置了前缀/WEB-INF/views/,所以HelloController中直接返回welcome即可,否则会拼接出/WEB-INF/views/views/welcome.jsp的错误路径,后续会触发404:
@Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView("welcome"); }
- 清理本地Maven缓存后重新打包启动项目即可。
内容的提问来源于stack exchange,提问作者Matin Parsapour
相关产品推荐
相关产品推荐

