如何为同一个Jersey REST API类配置多个根访问路径
实现方法
完全可以实现,不需要重复编写业务逻辑,常用两种方案:
方案1:修改@Path注解匹配双路径(JAX-RS原生支持,改动最小)
直接调整类上的@Path注解,利用路径模板的正则可选匹配规则,让单个注解同时覆盖两种路径格式,示例:
// 正则(v1/)?表示该位置可匹配v1/前缀,也可为空 @Path("/{prefix:(v1/)?}{start}/resource") public class ClassA{ // 原有业务逻辑无需任何改动 // 如果需要区分请求是否带v1前缀,只需在方法入参加@PathParam("prefix") String prefix即可 // 带v1的请求prefix值为"v1/",不带前缀的请求prefix值为空字符串 }
这个写法可以同时命中两个目标端点:
/v1/任意start值/resource/任意start值/resource
方案2:编程式注册多路径(无需修改原有类注解)
如果不想改动资源类上的原有注解,可以在Jersey配置类(继承ResourceConfig的类)中,给同一个资源类绑定多个路径模板,示例:
@ApplicationPath("/") public class AppJerseyConfig extends ResourceConfig { public AppJerseyConfig() { // 绑定原有带v1前缀的路径 register(Resource.builder(ClassA.class) .path("/v1/{start}/resource") .build()); // 绑定不带v1前缀的新路径 register(Resource.builder(ClassA.class) .path("/{start}/resource") .build()); } }
这种方式完全不需要修改ClassA的原有代码,后续如果还要加新的路径映射,直接在配置里追加注册即可。
注意事项
两种方案都不会造成ClassA被重复实例化,Jersey会复用同一个资源类的处理逻辑,不会产生冗余的资源对象。
内容的提问来源于stack exchange,提问作者Q2Dev
相关产品推荐
相关产品推荐

