访问Spring MVC应用URL时出现404错误的原因排查求助
看起来你遇到的问题很典型——控制台明明显示映射已注册,但请求就是没到达控制器,结合你的代码,我梳理了几个核心原因和对应的解决方案:
1. Tomcat插件配置未生效(最可能的根因)
你的pom.xml里把tomcat7-maven-plugin放在了<pluginManagement>标签下,这个标签仅用于统一管理插件版本和默认配置,并不会实际启用插件。这意味着你运行mvn tomcat7:run时,用的是Maven默认的Tomcat配置,此时应用的上下文路径是项目的artifactId(也就是in28Minutes-first-webapp),而非你配置的/。
解决方案:
把Tomcat插件从<pluginManagement>移到<build><plugins>标签下,确保自定义配置生效:
<build> <pluginManagement> <!-- 保留原有的插件版本管理内容 --> </pluginManagement> <plugins> <!-- 将Tomcat插件移到此处,启用自定义配置 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <contextReloadable>true</contextReloadable> </configuration> </plugin> </plugins> </build>
修改后重启Tomcat,应用上下文路径会变成/,此时访问http://localhost:8080/spring-mvc/login就能正确匹配到控制器。
2. 控制器类未被Spring正确扫描
虽然你配置了<context:component-scan base-package="com.wds"/>,但需要确认两个细节:
LoginController.java确实放在src/main/java/com/wds/springmvc/目录下(Maven只会编译这个路径下的Java文件)- 包名拼写完全一致(比如有没有把
com.wds写成com.wd这类低级错误)
如果Spring没扫描到控制器,即使写了@Controller注解,也不会生成映射。可以查看启动日志,找类似Mapped "{[/login]}" onto public java.lang.String com.wds.springmvc.LoginController.sayHello()的日志,确认映射是否真的被注册。
3. 验证请求路径匹配逻辑
你的DispatcherServlet映射路径是/spring-mvc/*,这个逻辑是正确的:
- 所有以
/spring-mvc开头的请求都会被DispatcherServlet接收 - Servlet会把
/spring-mvc之后的路径(也就是/login)交给Spring MVC的映射处理器,匹配你的@RequestMapping("/login")
但如果插件配置未生效,应用上下文路径是默认的in28Minutes-first-webapp,此时正确的访问URL应该是http://localhost:8080/in28Minutes-first-webapp/spring-mvc/login。
额外检查点
- 确认Tomcat启动时无报错:如果Spring初始化过程中出现依赖缺失、配置文件错误等异常,可能导致DispatcherServlet无法正常工作
- 临时移除
@ResponseBody测试:虽然你用这个注解直接返回字符串是正确的,但可以临时移除,加上简单的视图解析器配置,测试是否能跳转到视图,排除响应体处理的问题(Spring 4.2对@ResponseBody返回String的支持是完全没问题的)
按照上面的步骤排查,应该能快速解决你的404问题。
内容的提问来源于stack exchange,提问作者Dominic Keefe

