本文详解spring mvc应用中常见的404错误成因,聚焦于spring framework 6.x与thymeleaf 3.1+的版本不兼容问题,通过降级spring核心模块至5.3.24实现快速修复,并提供可验证的配置示例与最佳实践。
本文详解spring mvc应用中常见的404错误成因,聚焦于spring framework 6.x与thymeleaf 3.1+的版本不兼容问题,通过降级spring核心模块至5.3.24实现快速修复,并提供可验证的配置示例与最佳实践。
在基于传统XML配置的Spring MVC入门项目(如web.xml + applicationContextMVC.xml + JSP/HTML视图 + @Controller)中,部署后访问路径返回HTTP 404("The origin server did not find a current representation..."),往往并非路由映射或视图解析器配置失误,而是底层框架版本冲突所致。尤其当开发者混合使用较新组件(如Thymeleaf 3.1.1)与不兼容的Spring主版本(如6.0.5)时,DispatcherServlet可能无法正常初始化或注册HandlerMapping,导致请求根本未进入MVC调度链——此时日志中常无明显错误,但所有请求均被容器直接拒绝,表现为静默404。
根本原因分析
Spring Framework 6.0+ 是首个强制要求 Jakarta EE 9+(即jakarta.*命名空间)且完全弃用javax.* API 的主版本。而Thymeleaf 3.1.x 系列(包括3.1.1)虽已支持Jakarta EE 9,但其对Spring 6的适配存在滞后:官方明确指出,Thymeleaf 3.1.x 仅保证与Spring Framework 5.3.x 兼容;若强行搭配Spring 6.0.x,其SpringTemplateEngine、ThymeleafViewResolver等关键类在初始化时可能因反射失败、Bean注册异常或上下文生命周期错乱而静默失效,最终导致DispatcherServlet无法关联控制器方法,所有请求均落入Tomcat默认404处理流程。
正确解决方案:统一降级至Spring 5.3.24
无需修改web.xml、applicationContextMVC.xml或控制器代码,只需修正pom.xml中的Spring依赖版本:
<!-- 替换所有 spring-* 依赖的 version 为 5.3.24 -->
<properties><spring-framework.version>5.3.24</spring-framework.version></properties><dependencies><dependency><groupid>org.springframework</groupid><artifactid>spring-webmvc</artifactid><version>${spring-framework.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-web</artifactid><version>${spring-framework.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${spring-framework.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${spring-framework.version}</version></dependency><!-- Thymeleaf 3.1.1 保持不变,它与 Spring 5.3.x 完全兼容 --><dependency><groupid>org.thymeleaf</groupid><artifactid>thymeleaf-spring5</artifactid><version>3.1.1.RELEASE</version></dependency></dependencies>
✅ 验证要点:
- 清理Maven本地仓库中org/springframework相关缓存(~/.m2/repository/org/springframework),执行 mvn clean compile 强制重载依赖;
- 检查IDE(如IntelliJ)是否已刷新Maven项目(右键项目 → Reload project);
- 启动Tomcat后,观察控制台日志:应出现 Mapped "{[/hello]}" onto public java.lang.String ... 类似映射成功提示;
- 访问 http://localhost:8080/your-app/hello(确保URL路径与@RequestMapping一致)即可看到预期响应。
延伸建议与避坑指南
- 若坚持使用Spring 6.x,请升级Thymeleaf至 3.1.2+ 或直接采用 Thymeleaf 4.0.x(原生支持Spring 6),并切换依赖为 thymeleaf-spring6;
- 避免在pom.xml中对不同Spring模块指定混杂版本(如spring-webmvc:6.0.5 + spring-core:5.3.24),必须全局统一;
- 对于新项目,强烈推荐迁移到Spring Boot 3.x(内置Spring 6 + Jakarta EE 9),利用自动配置规避此类低层兼容性问题;
- Tomcat 9.0.73 与Java 17完全兼容,本例中非故障源,无需降级。
版本兼容性是传统Spring MVC项目稳定运行的基石。一次精准的依赖对齐,远胜于反复调试XML配置——请始终以官方兼容性矩阵为依据,让技术选型真正服务于开发效率。











