Spring MVC+Maven项目Tomcat9部署后出现404资源错误求助
我看了你的配置细节,Tomcat启动正常但访问出现404,大概率是Spring MVC的请求映射或配置细节出了问题,下面是几个排查和修复的方向:
1. Controller方法缺少请求映射注解
你的rcontroller类上标注了@RequestMapping("/"),但方法getFoosBySimplePath()没有添加任何请求映射注解(比如@GetMapping或@RequestMapping)。在Spring 4.x中,仅靠类上的路径注解不会自动把方法映射到对应路径,必须给方法也加上映射注解,否则Spring无法识别这是一个请求处理方法。
修改后的Controller代码:
package com.mycompany.myspring; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/") public class rcontroller { @GetMapping // 也可以用 @RequestMapping(method = RequestMethod.GET) @ResponseBody public String getFoosBySimplePath() { return "Get some Foos"; } }
2. 确认项目结构与配置文件路径匹配
你在web.xml里指定了contextConfigLocation为WEB-INF/dispatch-servlet.xml,要确保这个文件确实存在于WebContent/WEB-INF目录下(因为你的maven-war-plugin配置了warSourceDirectory为WebContent)。如果路径错误,Spring无法加载配置文件,导致Controller无法被扫描到。
标准的项目结构参考:
SpringMVC/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── mycompany/ │ │ └── myspring/ │ │ └── rcontroller.java │ └── resources/ └── WebContent/ ├── WEB-INF/ │ ├── dispatch-servlet.xml │ ├── web.xml │ └── lib/ └── (静态资源或页面文件)
3. 修正Servlet API依赖版本
你的web.xml声明的是Servlet 3.0版本,但pom.xml里依赖的是servlet-api:2.5,虽然scope设为provided,但Tomcat 9支持的是Servlet 3.1规范,版本不匹配可能引发潜在兼容性问题。建议替换为符合Tomcat 9的依赖:
<!-- 替换原有的servlet-api依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
4. 检查应用上下文路径
Tomcat默认会把war包名称作为应用上下文路径,你的pom.xml里finalName是SpringMVC,所以正确的访问地址应该是http://localhost:8080/SpringMVC/,而非直接访问http://localhost:8080/(除非你在Tomcat里配置了该应用为默认根应用)。
验证步骤
- 重新打包部署应用,确保Tomcat控制台无报错信息;
- 访问修正后的地址,查看是否返回预期的"Get some Foos";
- 如果问题仍存在,查看Tomcat日志目录下的
localhost.log和localhost_access_log.*.txt,确认请求是否到达DispatcherServlet,以及Spring是否成功扫描到Controller类。
内容的提问来源于stack exchange,提问作者TOMAS

