部署在AWS EC2实例的Spring Boot REST API返回404错误求助
解决Spring Boot WAR包部署Tomcat后API 404的思路
针对你遇到的问题,结合提供的信息,给出以下排查和解决步骤:
1. 优先解决版本兼容性问题
这是最可能的核心原因:
- Spring Boot 3.0.0 要求Servlet 6.0规范,而你使用的Tomcat 9仅支持到Servlet 4.0,版本完全不兼容,会导致Spring上下文无法正常初始化。
- 同时,Spring Boot 3.0.0要求Java 17及以上,你试过Java 8,这也会引发类加载失败等问题,直接导致应用无法启动。
解决方式二选一:
- 降级Spring Boot到2.7.x版本(支持Tomcat 9和Java 8),修改pom.xml中的parent版本:
同时将<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.15</version> <!-- 适配Tomcat9的稳定版本 --> <relativePath/> </parent>java.version改为1.8。 - 升级Tomcat到10.0.x及以上版本(支持Servlet 6.0),同时保持Java 17版本。
2. 检查启动类配置是否正确
打WAR包部署到外部Tomcat时,启动类必须继承SpringBootServletInitializer并重写configure方法,否则Tomcat无法识别并初始化Spring应用上下文。
你的启动类需要改成这样:
@SpringBootApplication public class AwsApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(AwsApplication.class); } public static void main(String[] args) { SpringApplication.run(AwsApplication.class, args); } }
3. 配置内置Tomcat为Provided
在pom.xml中添加内置Tomcat的依赖配置,设置为provided scope,避免和外部Tomcat的依赖冲突:
<dependencies> <!-- 其他已有依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies>
4. 验证上下文路径是否准确
- 登录Tomcat Manager,查看已部署应用的Path列值,确认是否和你访问URL中的上下文路径一致(比如是否是
/aws-0.0.1-SNAPSHOT)。 - 也可以直接查看EC2上Tomcat的
webapps目录,看WAR包解压后的文件夹名称,该名称就是默认的上下文路径。
5. 查看日志定位问题
- 查看Tomcat的
logs/catalina.out或localhost.log文件,检查是否有Spring上下文初始化失败的报错(比如类找不到、依赖缺失、版本不兼容的错误信息)。 - 确认日志中是否有类似
Mapping GET /login/code to public java.lang.String com.test.TestController.returnCode()的日志,这表示控制器映射已被正确加载。
内容的提问来源于stack exchange,提问作者Shubham Arya
相关产品推荐
相关产品推荐

