SpringMVC项目部署Tomcat访问根路径返回404错误求解
问题原因分析
- Tomcat 10 兼容性问题(最高发):Tomcat 10及以上版本基于Jakarta EE 9+规范开发,Servlet API的包名从原有
javax.servlet.*调整为jakarta.servlet.*。如果你的Spring MVC版本低于6.x,默认依赖的是旧版javax.servlet.*接口,会导致DispatcherServlet初始化失败,无法处理请求,自然无法完成视图解析跳转。你将JSP放到根目录可以直接访问,是因为根目录下的静态资源/页面不需要经过Spring MVC的DispatcherServlet处理,Tomcat自带的DefaultServlet可以直接返回资源。 - Spring 上下文加载异常:如果Spring MVC配置文件没有被DispatcherServlet正确加载,或者HomeController没有被组件扫描纳入Spring上下文,会导致根路径请求没有对应的处理器,直接返回404。
- 视图解析器配置错误:如果InternalResourceViewResolver的前缀路径拼写错误(比如缺前后斜杠、目录名大小写不匹配),会导致Spring MVC拼接出来的视图路径不存在,返回404。
解决方案
方案1:适配Tomcat 10 规范(优先推荐)
- 升级Spring MVC版本到6.x及以上,该版本已完成Jakarta EE规范适配,默认使用
jakarta.servlet.*相关接口。 - 将项目中所有Java EE相关依赖替换为Jakarta版本,例如把
javax.servlet-api替换为jakarta.servlet-api,scope保持provided即可。 - 更新web.xml头部声明为Jakarta EE对应版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- 保留原有web.xml配置内容 --> </web-app>
方案2:降级Tomcat版本(临时快速解决)
如果不想调整项目依赖,可直接将Tomcat版本降级到9.x及以下,该版本仍使用旧的javax.servlet.*规范,和低版本Spring MVC天然兼容。
方案3:排查配置正确性
- 确认Spring MVC配置文件中已开启组件扫描,且包路径覆盖HomeController所在的包,示例配置:
<context:component-scan base-package="替换为你项目Controller所在的包路径"/>
- 确认DispatcherServlet的初始化参数中正确指定了Spring MVC配置文件位置,示例配置:
<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:替换为你的Spring MVC配置文件路径,比如spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
- 检查InternalResourceViewResolver的前缀配置,确保前后斜杠完整,目录名和实际路径完全一致,示例配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean>
内容的提问来源于stack exchange,提问作者Denisa
相关产品推荐
相关产品推荐

