You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:14:07