使用Jersey开发RESTful WebService时遭遇404错误求助
排查RESTful WebService 404错误的实用步骤
兄弟,我之前也踩过REST服务404的大坑,太懂这种花几小时排查却毫无进展的挫败感了!结合你说的Tomcat能正常显示index、但访问http://localhost:8080/RestWs/rest/hello报404的情况,咱们一步步来定位问题:
1. 补全并检查web.xml核心配置
你贴的web.xml内容截断了,这部分是关键!重点确认以下几点:
- REST Servlet是否正确声明:如果用Jersey,要确保配置了
ServletContainer;如果是Spring MVC,要配置DispatcherServlet。 - Servlet映射路径是否匹配:你的请求路径是
/rest/hello,所以Servlet的url-pattern必须是/rest/*,不能写错。 - 包扫描路径是否正确:Jersey需要在
<init-param>里指定jersey.config.server.provider.packages,值是你的REST资源类所在包;Spring MVC则需要<context:component-scan base-package="xxx"/>扫描带注解的类。
给你一个Jersey的标准web.xml示例参考:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- 替换成你的REST类所在包 --> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.yourproject.rest</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>
2. 检查REST资源类的注解
你的hello接口对应的资源类,必须满足这些条件:
- 类上要有
@Path("/hello")注解(和请求路径的hello对应); - 如果是Jersey,类要在web.xml指定的扫描包下;如果是Spring MVC,类上要加
@RestController或者@Controller + @ResponseBody; - 方法上必须有HTTP方法注解,比如
@GET,否则无法匹配请求。
示例资源类(Jersey版本):
package com.yourproject.rest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String getHello() { return "Hello from REST Service!"; } }
3. 确认项目部署的上下文路径
Tomcat里你的项目上下文路径是不是RestWs?可以通过这两种方式确认:
- 去Tomcat的
webapps目录看,有没有RestWs文件夹,或者你的war包是不是叫RestWs.war(Tomcat默认用war包名作为上下文路径); - 看Tomcat启动日志,找类似
Deploying web application directory [xxx/webapps/RestWs]的行,确认上下文路径没错。有时候IDE部署会自动修改上下文路径,比如IDEA可能会加项目名后缀,这点要注意。
4. 检查依赖是否完整且无冲突
- 如果用Jersey,必须引入
jersey-server、jersey-servlet核心依赖,版本要统一; - 如果用Spring MVC,要确保
spring-webmvc依赖存在,且和Spring其他组件版本一致,避免依赖冲突导致初始化失败。
5. 查看Tomcat日志找隐藏错误
很多时候404并不是路径错了,而是REST服务在启动时就初始化失败了!去Tomcat的logs/catalina.out或者localhost.log里找报错信息,比如类找不到、注解扫描失败、Servlet初始化异常这些,这些隐藏错误才是导致404的真正原因。
如果按照以上步骤排查后还是解决不了,建议把完整的web.xml代码、REST资源类代码,以及Tomcat的启动日志贴出来,这样能更精准地定位问题!
内容的提问来源于stack exchange,提问作者peppo
相关产品推荐
相关产品推荐

