Tomcat9转10/Java11转17迁移:HttpServletDispatcher类转换异常求助
这个异常的核心原因是API包名迁移:Tomcat 10及以上采用Jakarta EE规范,Servlet相关接口从javax.servlet包迁移到了jakarta.servlet包。而你当前使用的Resteasy版本(3.15.6.Final、4.7.9.Final)都是基于旧的Java EE规范(javax.servlet)开发的,导致HttpServletDispatcher实现的是javax.servlet.Servlet,但Tomcat 10要求的是jakarta.servlet.Servlet,两个类来自不同类加载器,无法强制转换。
核心修复步骤
1. 升级Resteasy到Jakarta兼容版本
必须将Resteasy替换为支持Jakarta EE的版本(至少6.x及以上,推荐7.x版本适配Java17和Spring6)。示例POM配置:
<!-- 替换原resteasy-jaxrs为Jakarta兼容版本 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>7.0.12.Final</version> </dependency> <!-- 替换原resteasy-spring为Spring6适配版本 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-spring6</artifactId> <version>7.0.12.Final</version> </dependency>
注意:旧版
resteasy-spring在Jakarta生态中改名为resteasy-spring6,专门适配Spring 6.x系列。
2. 保证依赖版本兼容性
你的Spring Web已经使用6.1.15(支持Jakarta),Resteasy 7.x系列完美匹配Java17、Jakarta EE 10和Spring 6,避免版本冲突。
3. 验证web.xml配置
无需修改HttpServletDispatcher的类路径,新版本的该类已经实现了jakarta.servlet.Servlet接口,保持原有配置即可:
<servlet> <servlet-name>rest</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> <init-param> <param-name>jakarta.ws.rs.Application</param-name> <param-value>My Application</param-value> </init-param> </servlet>
4. 清理冲突依赖
检查项目中是否存在javax.servlet-api相关依赖,若有需移除,避免与jakarta.servlet-api产生类加载冲突。当前你的POM已使用jakarta.servlet-api,只需确保其他依赖未引入javax.servlet包即可。
内容的提问来源于stack exchange,提问作者jev

