Tomcat 10部署Spring Boot 3 WAR时路径重复致404问题求助
Spring Boot 3 WAR部署Tomcat 10出现404问题排查与解决
问题背景
将Spring 6应用迁移至Spring Boot 3,已完成XML配置到注解的替换,打包为WAR部署到Tomcat 10后,应用启动日志显示正常,但访问http://localhost:8080/war-name-1.0.0时出现404错误。
关键日志信息
2023-02-23T16:02:51.284+05:30 INFO 10708 --- [nio-8989-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2023-02-23T16:02:51.285+05:30 INFO 10708 --- [nio-8989-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2023-02-23T16:02:51.307+05:30 WARN 10708 --- [nio-8989-exec-2] o.s.web.servlet.PageNotFound : No mapping for GET /war-name-1.0.0/war-name-1.0.0/ 2023-02-23T16:02:51.308+05:30 ERROR 10708 --- [nio-8989-exec-2] o.s.b.w.servlet.support.ErrorPageFilter : Cannot forward to error page for request [/index.html] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false
当前配置与代码
配置文件内容
spring.jmx.enabled=true server.port = 9292
主类代码
@SpringBootApplication public class MyApplication { public static void main(String[] args) { try { SpringApplication app = new SpringApplication(MyApplication.class); app.run(args); } catch(Throwable ex) { ex.printStackTrace(); } } }
Servlet初始化器代码
public class MyServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyApplication.class); } }
问题分析
- 路径重复问题:日志中
No mapping for GET /war-name-1.0.0/war-name-1.0.0/说明请求路径出现重复的上下文名称,大概率是应用内部配置与Tomcat部署上下文冲突导致。 - 无效端口配置:
server.port = 9292在外部Tomcat部署场景下完全无效,容器端口由Tomcat自身server.xml配置决定,应用上下文路径默认是WAR包文件名。 - 缺少根路径映射:应用未对根路径
/配置请求处理逻辑,导致访问上下文根时找不到对应映射。
解决步骤
- 移除无效端口配置:删除配置文件中的
server.port = 9292,避免与Tomcat端口配置混淆。 - 添加根路径请求映射:创建基础控制器处理根路径请求,示例代码如下:
若为REST接口,可改用@Controller public class HomeController { @GetMapping("/") public String home() { // 返回index页面或直接返回响应内容 return "index"; } }@RestController+@GetMapping("/")返回字符串响应。 - 确认WAR打包配置:使用Maven时,确保
pom.xml正确配置WAR打包并排除内置Tomcat:<packaging>war</packaging> <dependencies> <!-- 排除内置Tomcat,依赖外部容器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> - 验证Servlet初始化器:确保
MyServletInitializer与主类MyApplication在同一包下,或被Spring组件扫描覆盖,保证应用能正常初始化。 - 重新部署测试:重新打包WAR文件替换Tomcat
webapps目录下的旧文件,重启Tomcat后访问http://localhost:8080/war-name-1.0.0即可正常访问。
内容的提问来源于stack exchange,提问作者suhail ahmed
相关产品推荐
相关产品推荐

