CXF 3.4.4搭配Tomcat 10报类转换异常是否需降级为Tomcat 9
问题原因
你遇到的类转换异常是Java EE迁移到Jakarta EE后的包名不兼容导致的:
- Tomcat 10基于Servlet 5.0规范,所有Servlet相关API的包名从旧的
javax.servlet调整为jakarta.servlet - 你当前使用的CXF 3.4.4版本仍基于旧的
javax.servlet规范开发,org.apache.cxf.transport.servlet.CXFServlet实现的是javax.servlet.Servlet接口,和Tomcat 10要求的jakarta.servlet.Servlet不属于同一个类,因此加载时抛出类型转换错误。
解决方式
你不需要强制降级Tomcat 9,有两种可选方案:
方案1:保留现有CXF版本,降级Tomcat到9.x
Tomcat 9.x仍然使用javax.servlet包规范,和CXF 3.4.4完全兼容,不需要修改任何业务代码和依赖配置,直接重新部署即可。
方案2:保留Tomcat 10,升级CXF到支持Jakarta规范的版本
CXF从3.5.0版本开始提供Jakarta EE兼容的发行版本,你只需要将所有CXF相关依赖替换为带-jakarta后缀的版本即可,比如Maven依赖需要调整为:
<!-- 示例:替换http传输依赖为jakarta版本 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jakarta</artifactId> <version>3.5.0</version> <!-- 可选择更高的稳定版 --> </dependency>
注意:如果你的业务代码中直接导入了
javax.servlet相关类,也需要同步将导入路径改为jakarta.servlet开头的对应类,避免后续出现类找不到错误。
内容的提问来源于stack exchange,提问作者Mike Bikoulis
相关产品推荐
相关产品推荐

