从Tomcat7/Jersey2.25/Servlet2.5升级到Tomcat10/Jersey3.0.8/Servlet5遇404错误
排查Tomcat10 + Jersey3.0.8 404问题的核心步骤
1. 彻底切换到Jakarta命名空间依赖
Tomcat10和Jersey3.x均基于Jakarta EE规范,必须完全替换原javax.*相关依赖:
- 移除所有
javax.servlet、javax.ws.rs开头的旧依赖 - 确保Jersey依赖使用3.0.8的Jakarta版本,示例Maven依赖:
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-jakarta</artifactId> <version>3.0.8</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>3.0.8</version> </dependency> - 全局替换代码中的import:把所有
javax.ws.rs.*改为jakarta.ws.rs.*,包括@ApplicationPath、@Path、@GET等核心注解
2. 修正web.xml的Schema配置
Tomcat10要求web.xml使用Jakarta官方Schema,替换原Java EE的命名空间:
<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方式配置Jersey,需指定Jakarta版本的容器类:
<servlet> <servlet-name>Jersey Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jakarta.ws.rs.Application</param-name> <param-value>com.yourpackage.AppConfig</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Jersey Servlet</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
3. 规范@ApplicationPath的使用
- 避免使用
/*(这是Servlet映射语法),仅需指定路径前缀,比如@ApplicationPath("/api"),资源访问路径为/api/[资源类@Path值] - 若设为
@ApplicationPath("/"),需确保Tomcat默认ROOT应用未抢占路径,且无其他Servlet映射冲突
4. 验证资源类注解有效性
- 资源类必须添加
@Path注解(如@Path("/connect")) - 接口方法需正确标注
@GET/@POST等请求方法注解 - 再次确认所有注解均来自
jakarta.ws.rs包
5. 通过Tomcat日志定位根因
- 查看
localhost.log,排查Jersey初始化时的报错(如资源类扫描失败、注解处理异常) - 查看
localhost_access_log.*,确认请求是否真的到达Jersey容器
内容的提问来源于stack exchange,提问作者BradB
相关产品推荐
相关产品推荐

