RESTful服务遇404错误及Servlet类型转换异常求助
问题根源与解决方案
核心问题:版本兼容冲突
你遇到的两个问题(类转换异常、404错误)本质是规范版本不兼容:
- Tomcat 10.x 是基于Jakarta EE 9+ 规范开发的,所有Servlet相关API的包名已从
javax.servlet.*改为jakarta.servlet.* - 你使用的Jersey 2.40.0是基于旧的Java EE规范开发的,它的
ServletContainer实现类继承的是javax.servlet.Servlet,和Tomcat 10要求的jakarta.servlet.Servlet属于完全不同的类体系,直接导致Servlet无法初始化,最终返回404。
具体修复步骤
1. 升级Jersey到兼容Jakarta EE的版本
Jersey从3.x版本开始支持Jakarta EE规范,你需要将Jersey版本更换为3.x及以上稳定版(比如3.1.5)。
2. 替换代码中的包引用
把所有Java EE风格的Jersey相关包替换为Jakarta版本:
- 将
import javax.ws.rs.*替换为import jakarta.ws.rs.* - 其他Jersey注解、工具类的包名,也需要同步替换为
jakarta.xxx前缀
3. 更新web.xml配置
修改web.xml的根节点命名空间为Jakarta EE标准,同时确保Servlet配置正确:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的服务类所在包路径</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
4. 清理并更新依赖库
- 移除所有旧的Java EE风格依赖(比如
javax.servlet-api、旧版本Jersey包) - 确保引入的依赖都是Jakarta兼容版本:比如
jakarta.servlet-api、Jersey 3.x的jersey-server、jersey-container-servlet等
额外检查项
- 查看Tomcat日志(
logs/localhost.log、logs/catalina.log),确认项目部署过程中没有其他报错 - 验证访问URI的正确性:确保项目上下文路径是
UserManagement,REST根路径是rest,且UserService类的@Path注解配置与访问路径匹配(比如@Path("/UserService")搭配@Path("/users"))
内容的提问来源于stack exchange,提问作者Srijan Erroju
相关产品推荐
相关产品推荐

