GET请求调用JAX-RS服务返回404无响应问题如何排查
JAX-RS服务在Tomcat 9返回404的常见原因及解决方案
核心触发原因
Tomcat 9是轻量级Servlet容器,本身未内置JAX-RS规范的实现(如Jersey、RestEasy),没有对应实现的情况下,你写的JAX-RS注解不会被容器识别加载,直接返回404是普遍情况。
其他可能的错误点
1. 遗漏JAX-RS实现依赖
以常用的Jersey实现为例,如果你用Maven管理依赖,需要在pom.xml中引入适配Servlet环境的Jersey包:
如果是手动导入jar包,需要把Jersey相关的所有依赖包放到项目的<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.41</version> <!-- 适配Tomcat9+Java EE 8的版本,不要用3.x以上的jakarta版本 --> </dependency>WEB-INF/lib目录下。2. 访问路径遗漏应用上下文
Tomcat部署war包时,默认上下文路径就是war包的文件名,比如你的项目打包为jaxrs-demo.war,正确的访问地址应该是:http://localhost:8080/jaxrs-demo/api/hello-world
你可以查看Tomcat启动日志,找到类似Context initialized for context path [/xxx]的日志,/xxx就是你需要加的上下文路径。
另外直接访问/api路径返回404属于正常情况,因为你没有配置@Path("/")对应的资源方法。3. 注解包导入错误
Tomcat 9支持的是Java EE规范,所有JAX-RS相关注解必须导入javax.ws.rs包下的类,如果你错误导入了Jakarta EE的jakarta.ws.rs包(适配Tomcat 10+),所有注解都会失效。4. 未注册资源类
部分JAX-RS实现需要你手动在Application子类中注册资源类,修改你的HelloApplication代码:
也可以配置Jersey的包扫描参数,自动识别同包下的资源类。@ApplicationPath("/api") public class HelloApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(HelloResource.class); return resources; } }5. web.xml配置错误
确保你的WEB-INF/web.xml的根标签版本至少是3.0以上,支持注解扫描,不要手动配置Servlet覆盖了/api前缀的路径映射。
内容的提问来源于stack exchange,提问作者coder-coder
相关产品推荐
相关产品推荐

