使用JAX-RS/Jersey开发Web服务,访问Tomcat时遇HTTP 404求助
嘿,针对你遇到的Jersey Web服务在Tomcat上返回404的问题,结合IntelliJ的开发环境,我整理了几个核心排查方向,你可以逐一检查:
1. 补全并验证web.xml的核心配置
你提供的web.xml片段不完整,Jersey的Servlet配置是关键,得确保这部分没问题:
- 首先确认Servlet类的全限定名:Jersey 2.x用
org.glassfish.jersey.servlet.ServletContainer,1.x版本是com.sun.jersey.spi.container.servlet.ServletContainer,别搞混版本 - 必须添加
init-param指定REST资源类所在的包,让Jersey能扫描到你的接口:
<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>com.yourcompany.yourproject.resources</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置Servlet映射,这里的url-pattern决定了访问前缀 --> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
- 注意
servlet-mapping的url-pattern,后续访问路径必须包含这个前缀
2. 确认项目依赖无缺失/冲突
- 如果用Maven/Gradle管理依赖,Jersey 2.x必须引入
jersey-container-servlet(这是和Tomcat集成的核心依赖),Maven示例:
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.41</version> <!-- 替换成你使用的Jersey版本 --> </dependency>
- 别把Jersey的JAR包同时放在项目
WEB-INF/lib和Tomcat的全局lib目录下,会引发类加载冲突,导致Servlet初始化失败
3. 检查IntelliJ的Tomcat部署配置
- 打开IntelliJ的Run/Debug Configurations,找到你的Tomcat实例,确认Deployment标签里的应用上下文路径是否正确(比如
/jersey-sample),访问URL必须包含这个路径 - 检查Tomcat的
webapps目录下是否有你的项目文件夹,确保IntelliJ已经把项目正确部署上去了 - 验证Project Structure里的Web模块配置:确认
Web Resources Directory指向src/main/webapp,且web.xml被标记为Deployment Descriptor
4. 检查REST资源类的注解是否规范
- 资源类必须标注
@Path注解,方法要对应@GET/@POST等HTTP方法注解,比如:
package com.yourcompany.yourproject.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; // 这里的路径会拼接在servlet-mapping的url-pattern之后 @Path("hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello from Jersey!"; } }
- 注意注解包:Jersey 2.x用
javax.ws.rs(Java EE)或jakarta.ws.rs(Jakarta EE),不要混用不同版本的注解
5. 查看Tomcat日志找根源
打开Tomcat的logs/catalina.out或localhost.log,搜索是否有类加载失败、Servlet初始化报错的信息——很多时候404只是表象,实际是Jersey的Servlet没启动成功,日志里会有明确的错误提示
6. 验证访问URL的正确性
举个例子:如果你的项目上下文是/jersey-sample,servlet映射是/api/*,资源类@Path("hello"),那正确的访问URL应该是:http://localhost:8080/jersey-sample/api/hello
别漏掉上下文路径或Servlet映射的前缀,也别写错资源类的@Path值
内容的提问来源于stack exchange,提问作者JollyRoger
相关产品推荐
相关产品推荐

