SpringBoot+React项目部署Tomcat9后API请求404求助
问题分析与解决步骤
核心问题:WAR包部署到Tomcat9后,Spring容器未初始化(日志无Spring启动信息),导致后端API无法访问,仅前端静态资源可正常加载。
1. 修正Maven依赖与打包配置
确保pom.xml中正确设置WAR打包类型,并排除内置Tomcat依赖(避免与服务器Tomcat冲突):
<!-- 明确打包类型为WAR --> <packaging>war</packaging> <dependencies> <!-- 排除Spring Boot内置Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 提供Tomcat依赖,仅编译时使用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies>
2. 验证SpringBootServletInitializer实现
你的App类继承写法正确,但需确保:
@SpringBootApplication注解能扫描到所有后端组件(如Controller、Service)。如果控制器不在App类的子包下,需添加@ComponentScan(basePackages = "你的后端包路径")。- 示例调整:
@SpringBootApplication @ComponentScan(basePackages = "com.yourpackage") // 替换为实际包路径 public class App extends SpringBootServletInitializer{ // ... 原有代码不变 }
3. 检查WAR包结构是否合法
解压生成的record-retention.war,确认:
WEB-INF/classes目录存在,且包含编译后的Java类(如App.class、Controller类等)。WEB-INF/lib目录存在,且包含所有Spring Boot及第三方依赖jar包。- 若存在
WEB-INF/web.xml,需确保其配置未干扰Spring Boot的初始化(建议删除该文件,由Spring Boot自动生成)。
4. 开启Tomcat详细日志排查
修改Tomcat安装目录下conf/logging.properties,添加Spring框架日志级别:
org.springframework.level = INFO
重启Tomcat后,查看catalina.out或localhost.log,若Spring正常启动,会打印类似Started App in X seconds的日志;若有初始化错误,也会在此输出具体异常信息。
5. 修正API请求路径
本地运行时API路径为http://localhost:8080/api/xxx,部署到Tomcat后,WAR包的上下文路径为record-retention,因此正确API路径应为http://服务器IP:8080/record-retention/api/xxx。
- 需调整前端代码中的API请求前缀,或在Spring Boot配置文件中设置:
server.servlet.context-path=/record-retention
6. 确认Spring Boot与Tomcat版本兼容性
- Spring Boot 2.x系列(如2.7.x)兼容Tomcat 9。
- Spring Boot 3.x系列需要Tomcat 10及以上版本,若你使用的是Spring Boot 3.x,需升级Tomcat版本或降级Spring Boot到2.x。
内容的提问来源于stack exchange,提问作者Miguel Contreras
相关产品推荐
相关产品推荐

