在现有Java应用中嵌入Jersey 3与Jetty搭建REST API时资源无法识别的404问题排查
问题根源:资源类与配置类混同
你的核心问题是把REST端点方法直接定义在了继承ResourceConfig的应用配置类中,这不符合Jersey的设计规范。ResourceConfig的作用是配置Jersey应用(比如注册资源类、启用特性),而实际的REST资源端点需要放在单独的类里,才能被Jersey识别并注册。
解决方案:拆分配置类与资源类
1. 重构配置类
修改LoginserverRestApi,让它只负责配置应用,注册你的资源类:
package de.l2d; import org.glassfish.jersey.server.ResourceConfig; import jakarta.ws.rs.ApplicationPath; @ApplicationPath("/login") public class LoginserverRestApi extends ResourceConfig { public LoginserverRestApi() { // 注册你的资源类 register(LoginStatusResource.class); } }
2. 创建独立的资源类
新建一个专门的资源类,存放你的REST端点方法:
package de.l2d; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @Path("/status") public class LoginStatusResource { @GET public String status() { // TODO Return real server statistics. return "{\"status\":\"ok\"}"; } }
3. 验证依赖(可选优化)
检查你的pom.xml,嵌入式Jetty场景下jersey-container-servlet依赖可以移除,因为你用的是jersey-container-jetty-http,不需要Servlet容器的相关依赖。
为什么之前会返回404?
Jersey不会自动将ResourceConfig的子类当作REST资源类来扫描和注册,所以你写在LoginserverRestApi里的status()方法根本没有被识别为有效的REST端点。拆分后,通过register()方法明确告诉Jersey要加载哪个资源类,端点就能正常被访问了。
测试验证
启动应用后,访问http://localhost/login/status,应该就能得到{"status":"ok"}的响应了。如果还是有问题,可以查看控制台日志,确认Jersey是否输出了资源注册的相关信息(比如Registered resources:开头的日志),以此判断资源是否被正确加载。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

