Spring Boot WAR包部署Tomcat 10.1.7报错:ErrorPageFilter重复注册
问题根因分析
Tomcat 10.1.x基于**Jakarta EE 9+**规范,使用jakarta.servlet包路径;而Spring Boot 2.x版本依赖的是旧版javax.servlet规范,两者API包名不兼容。ErrorPageFilter是Spring Boot内置的过滤器,它试图注册到Tomcat 10的ServletContext时,因API路径不匹配导致注册失败——这才是问题的核心,不是单纯关闭日志能解决的。
解决方案
方案1:彻底停用ErrorPageFilter(快速临时修复)
你之前配置logging.level.org.springframework.boot.context.web.ErrorPageFilter=off只是关闭了该类的日志输出,并没有真正停用过滤器。正确的代码配置方式如下:
创建一个Spring配置类,放在项目主配置包下(和启动类同包或子包,确保能被扫描到):
import org.springframework.boot.context.web.ErrorPageFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatDeploymentConfig { @Bean public FilterRegistrationBean<ErrorPageFilter> disableErrorPageFilter() { FilterRegistrationBean<ErrorPageFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new ErrorPageFilter()); registration.setEnabled(false); return registration; } }
方案2:升级到Spring Boot 3.x(长期适配方案)
Spring Boot 3.x完全基于Jakarta EE 9+规范,和Tomcat 10.x的API完全兼容,能从根源上解决这类包路径冲突问题。升级要点:
- 修改pom.xml中Spring Boot父依赖版本为3.x(例如
3.2.0) - 替换所有
javax.servlet相关自定义依赖为jakarta.servlet(Spring Boot 3会自动处理大部分框架依赖) - 调整代码中的导入路径,比如将
javax.servlet.http.HttpServletRequest替换为jakarta.servlet.http.HttpServletRequest
方案3:降级Tomcat版本(过渡方案)
如果暂时无法升级Spring Boot,可以将Docker环境中的Tomcat版本降级到9.x(基于javax.servlet规范),这样和Spring Boot 2.x兼容性更好,无需修改代码。
额外排查项
- 检查WAR包构建配置:确保pom.xml中已设置
<packaging>war</packaging>,并排除Spring Boot内置Tomcat依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
- 确认Docker中Tomcat的部署状态:检查webapps目录下的WAR是否正常解压,查看Tomcat启动日志是否有其他前置错误。
内容的提问来源于stack exchange,提问作者Richter
相关产品推荐
相关产品推荐

