升级Java与Spring Boot后启动报错:resourceUrlEncodingFilter Bean创建失败
解决Spring Boot 3.2.1 + Java 21 + Apache Tiles启动时resourceUrlEncodingFilter创建失败问题
核心原因
Spring Boot 3.x基于Jakarta EE 9+,原javax包已全面迁移为jakarta包,但Apache Tiles旧版本仍依赖javax.servlet相关API,这种依赖冲突会导致Spring无法正常创建resourceUrlEncodingFilter这类与Servlet上下文绑定的Bean。
具体修复方案
1. 升级Apache Tiles到Jakarta兼容版本
使用支持Jakarta EE的Tiles版本(3.1.0及以上),替换项目中旧的Tiles依赖:
Maven示例:
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-spring</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>3.1.0</version> </dependency>
Gradle示例:
implementation 'org.apache.tiles:tiles-spring:3.1.0' implementation 'org.apache.tiles:tiles-jsp:3.1.0'
2. 调整resourceUrlEncodingFilter配置(若手动配置过)
如果项目中手动注册了该Filter,需确保所有Servlet相关依赖都使用jakarta包:
@Bean public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() { FilterRegistrationBean<ResourceUrlEncodingFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new ResourceUrlEncodingFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; }
检查导入语句,确保所有Servlet相关类来自jakarta.servlet包,而非旧的javax.servlet。
3. 清理过时配置
删除或更新项目中web.xml、Spring XML配置里针对resourceUrlEncodingFilter的旧版配置,避免与Spring Boot 3.x的自动配置逻辑冲突。
4. 排查依赖冲突
执行依赖树命令检查是否存在javax和jakarta Servlet API混合依赖:
- Maven:
mvn dependency:tree - Gradle:
gradle dependencies
发现javax.servlet相关依赖时,通过<exclusions>(Maven)或exclude(Gradle)排除。
5. 同步其他Servlet相关库版本
若项目使用JSTL等工具,需升级到Jakarta兼容版本(如JSTL 2.0+),确保整个Servlet生态依赖统一。
内容的提问来源于stack exchange,提问作者Shamiul Islam
相关产品推荐
相关产品推荐

