You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat9转10/Java11转17迁移:HttpServletDispatcher类转换异常求助

解决Tomcat10+Java17迁移中的ClassCastException问题

这个异常的核心原因是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:12:36