运行Spring MVC项目遭遇404错误,请求协助定位问题
运行Spring MVC项目时遭遇404错误,已通过Java注解配置将根请求(/)映射到home.jsp,检查映射规则后未发现明显问题。映射方法内添加的System.out.println语句也未在控制台输出,附上相关代码、项目结构及控制台日志信息,请求协助排查问题。
相关代码
HomeController
@Controller public class HomeController { @GetMapping("/") public String home() { System.out.println("jjjjjjjjjjjjjjjjjj"); return "home"; } }
Dispatcher Servlet配置类
public class DispServler extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] {ConfigurationClass.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } }
Spring MVC配置类
@Configuration @EnableWebMvc @ComponentScan(basePackages="com.veera") public class ConfigurationClass { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver vr = new InternalResourceViewResolver(); vr.setPrefix("/"); vr.setSuffix(".jsp"); return vr; } }
相关截图
- 404错误页面截图
- 项目结构截图
- 控制台日志截图
排查与解决方案
从代码和现象来看,System.out.println未输出说明请求根本没走到HomeController的home方法,核心问题集中在DispatcherServlet未正确拦截请求或组件扫描失效,按以下步骤排查:
验证组件扫描范围
确认HomeController所在包是否属于com.veera路径下。如果控制器不在该包内,@ComponentScan无法扫描到,Spring不会将其注册为Bean,自然无法处理请求。可修改配置类的扫描规则,明确指定控制器所在包,比如:@ComponentScan(basePackages = {"com.veera.controller"})检查DispatcherServlet初始化状态
查看控制台日志,是否存在Spring MVC初始化的相关日志(比如Mapped "/" onto public java.lang.String com.veera.HomeController.home())。如果没有这类日志,说明DispatcherServlet未启动:- 检查项目是否成功部署到Web容器(如Tomcat),确认容器版本与Spring MVC版本兼容(Spring MVC 5.x需Tomcat 8.5+,6.x需Tomcat 9+);
- 确认项目Servlet版本符合要求(至少3.0+),
AbstractAnnotationConfigDispatcherServletInitializer依赖Servlet 3.0+的注解式注册机制。
核对JSP文件路径与ViewResolver配置
确认home.jsp是否放在Web应用根目录下(对应ViewResolver的prefix="/")。如果JSP文件在WEB-INF目录下,需将prefix修改为"/WEB-INF/",既符合安全规范,也能确保ViewResolver正确找到文件。检查项目依赖完整性
确保Maven/Gradle依赖中包含Spring MVC核心包与Servlet API包,避免依赖缺失导致初始化失败:<!-- Maven示例 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>你的Spring版本</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>添加调试验证
在DispServler的onStartup方法中添加打印语句,确认初始化类是否被执行;或开启Spring日志调试模式,查看请求流转细节。
优先排查组件扫描和DispatcherServlet初始化这两个核心点,多数情况下问题都出在这里。
内容的提问来源于stack exchange,提问作者Veera Ezhil Vendhan V

