本地Gradle运行Spring应用,Tomcat访问URL返回404错误排查
本地Tomcat运行Spring应用404问题排查
1. 上下文路径不匹配
App Engine默认将应用部署在根上下文路径(即/),但本地Tomcat部署时,通常会以项目名作为上下文路径前缀。比如你的项目名为agent-app,实际访问路径应该是:
- 根路径:
http://localhost:8080/agent-app/ - Controller路径:
http://localhost:8080/agent-app/AgentInfoAction/ccpView
排查方式:
- 查看Tomcat启动日志,找到类似
Deploying web application archive [xxx.war]的日志,后面会显示部署的上下文路径。 - 如果用Gradle的Tomcat插件,检查
build.gradle里的tomcat配置,是否设置了contextPath = ''(强制根路径):
tomcat { contextPath = '' port = 8080 }
2. Web.xml欢迎页配置缺失
App Engine可能自动识别index.jsp为欢迎页,但本地Tomcat需要在web.xml中明确配置:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
如果没有这段配置,访问根路径时Tomcat找不到默认页面,直接返回404。
3. Spring DispatcherServlet映射错误
检查web.xml中DispatcherServlet的映射规则,确保能覆盖到你的Controller请求:
<servlet-mapping> <servlet-name>dispatcher</servlet-name> <!-- 若Controller路径为/AgentInfoAction/*,可以映射为/AgentInfoAction/*或/* --> <url-pattern>/AgentInfoAction/*</url-pattern> </servlet-mapping>
如果映射规则设为*.do这类后缀匹配,而你的Controller路径没有后缀,请求就无法被DispatcherServlet处理。
4. Controller未被正确扫描或映射错误
- 确认
AgentInfoAction类上添加了@Controller注解,且类级别或方法级别的@RequestMapping路径正确:
@Controller @RequestMapping("/AgentInfoAction") public class AgentInfoAction { @RequestMapping("/ccpView") public String ccpView() { return "ccpView"; // 对应JSP文件名,需匹配视图解析器配置 } }
- 检查Spring配置文件(或启动类)是否开启了组件扫描,确保Controller所在包被覆盖:
<!-- XML配置方式 --> <context:component-scan base-package="com.yourpackage.controller"/>
// 注解配置方式(Spring Boot) @SpringBootApplication(scanBasePackages = "com.yourpackage.controller")
5. 视图解析器配置错误
如果Controller返回的JSP路径不正确,会导致找不到页面返回404。检查Spring的视图解析器配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- JSP文件所在目录 --> <property name="suffix" value=".jsp"/> <!-- 文件名后缀 --> </bean>
比如返回"ccpView"时,会查找/WEB-INF/jsp/ccpView.jsp,如果文件实际存放在/jsp/目录下,就会找不到。
6. Tomcat版本与依赖不兼容
App Engine使用的Tomcat版本(如9.x)和本地Tomcat版本(如10.x)可能存在Servlet API差异:
- Tomcat 9及以下使用Java EE(包名
javax.servlet) - Tomcat 10+使用Jakarta EE(包名
jakarta.servlet)
如果本地用了Tomcat 10,但项目依赖的是javax.servlet相关包,会导致Spring容器初始化失败,Controller无法生效。此时要么降级本地Tomcat到9.x,要么将项目依赖替换为Jakarta EE版本。
7. Gradle构建与部署问题
- 确认
build.gradle中正确应用了war插件,且打包的war包包含所有必要文件:
plugins { id 'war' }
- 本地部署时,确保Tomcat的
webapps目录下的war包是最新构建的,没有缓存旧版本。可以执行gradle clean war重新打包后再部署。
内容的提问来源于stack exchange,提问作者helloi
相关产品推荐
相关产品推荐

