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

带@Path注解的JAX-RS资源未被自动扫描,请求报404错误

问题原因

你遇到的情况本质是Jersey不同启动方式的扫描逻辑差异:

  • 当通过Servlet容器(如Tomcat)部署,或使用带@ApplicationPath注解的ResourceConfig子类时,Jersey会自动扫描当前包及其子包下的资源类。
  • 但你直接调用GrizzlyHttpServerFactory.createHttpServer(URI)时,这个重载方法默认只创建一个空的应用上下文,不会触发任何类路径扫描,所以你的Hello资源类根本没被注册到服务器中,自然返回404。
无需显式注册包的解决方案

下面两种方法可以实现自动识别资源类,不用手动指定包路径:

方法1:创建带@ApplicationPath的应用配置类

定义一个继承自ResourceConfig的类,添加@ApplicationPath注解,Jersey会自动扫描该类所在包及子包的资源:

package com.example;

import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        // 无需手动配置packages,注解会触发自动扫描
    }
}

然后修改Main.java的启动方法,传入这个配置类:

public static HttpServer startServer() {
    return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), new AppConfig());
}

方法2:直接启用扫描的简化写法

如果不想额外创建配置类,也可以在启动时通过ResourceConfig的静态方法快速开启扫描:

public static HttpServer startServer() {
    // 扫描指定根包下的所有资源类,这里用主类所在的com.example包
    ResourceConfig rc = ResourceConfig.forApplicationClass(Main.class);
    return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
注意事项
  • 确保项目依赖完整:必须包含jersey-server和jersey-container-grizzly2-http,这两个模块是实现扫描和Grizzly容器集成的基础。
  • 资源类的注解必须正确:Hello类的@Path和方法的@GET注解不能遗漏,否则扫描逻辑会忽略该类。

内容的提问来源于stack exchange,提问作者Aditya Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:17:06