带@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
相关产品推荐
相关产品推荐

