
本文详解spring mvc应用中常见的404错误成因,聚焦于spring framework 6.x与thymeleaf 3.1.x等组件间的版本不兼容问题,并提供可立即生效的pom.xml配置修正方案。
本文详解spring mvc应用中常见的404错误成因,聚焦于spring framework 6.x与thymeleaf 3.1.x等组件间的版本不兼容问题,并提供可立即生效的pom.xml配置修正方案。
在基于传统XML配置(如web.xml + applicationContextMVC.xml)构建的Spring MVC入门项目中,启动后访问控制器路径却返回HTTP 404(“The origin server did not find a current representation…”),往往并非路由配置或视图解析器设置失误,而是底层框架版本冲突导致DispatcherServlet未能正常初始化——这是初学者极易忽略却高频发生的“静默失败”。
根本原因在于:Spring Framework 6.0+ 与 Thymeleaf 3.1.x 存在不兼容性。
Thymeleaf 3.1.1(当前稳定版)的spring5support模块仅适配 Spring 5.x 的API签名(如org.springframework.web.servlet.HandlerMapping的构造逻辑、WebMvcConfigurer默认方法实现等)。当项目强制引入 Spring 6.0.5(如spring-webmvc, spring-context等),而未同步升级Thymeleaf至支持Spring 6的3.2.x(需Spring 6.1+)或更高版本时,Spring容器在初始化ThymeleafViewResolver或相关HandlerMapping时会因类加载失败或Bean注册异常而跳过MVC核心组件初始化——结果就是DispatcherServlet虽启动成功,但实际未注册任何Handler,所有请求均落入Tomcat默认404流程。
✅ 正确解决方案(立即生效):
将pom.xml中所有Spring相关依赖统一降级至 5.3.24(Spring 5最后一个维护版本,与Thymeleaf 3.1.x完全兼容):
<properties><spring.version>5.3.24</spring.version></properties><dependencies><dependency><groupid>org.springframework</groupid><artifactid>spring-webmvc</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-web</artifactid><version>${spring.version}</version></dependency><!-- Thymeleaf 3.1.1 自动依赖 spring5support --><dependency><groupid>org.thymeleaf</groupid><artifactid>thymeleaf-spring5</artifactid><version>3.1.1.RELEASE</version></dependency></dependencies>
⚠️ 关键注意事项:
- 切勿混用Spring 5与6:即使仅spring-webmvc为6.x,其他模块为5.x,也会因包内SPI机制或反射调用引发NoSuchMethodError;必须全量对齐。
- 验证方式:清理Maven本地仓库中org/springframework/目录,执行mvn clean compile后检查target/classes/META-INF/maven/下各jar的pom.properties,确认版本一致。
- 替代方案(推荐长期使用):若需Spring 6+特性,应升级Thymeleaf至 3.2.0+ 并显式声明thymeleaf-spring6(Spring 6.1+要求),同时弃用XML配置,改用Java Config或@Configuration类——但这已超出基础HelloWorld范畴。
总结:404在此场景中是“假象”,本质是Spring容器启动失败后的兜底响应。排查时优先检查catalina.out日志中是否出现Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/config/annotation/WebMvcConfigurer等线索,而非反复调试@RequestMapping或InternalResourceViewResolver。版本对齐永远是Spring生态集成的第一守则。











