JAX-RS中@ApplicationPath如何配置支持v1/v2等多版本资源路径?
JAX-RS同时适配多版本前缀的两种可行配置方案
方案1:统一根路径,版本号下沉到资源类(适配成本最低)
直接修改现有ApplicationConfig的@ApplicationPath为根路径,将版本号写到各资源的@Path前缀中,无需额外配置:
- 修改全局应用配置:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/") @Component public class ApplicationConfig extends Application { }
- 调整资源类的
@Path注解,补充对应版本前缀:
// v1版本资源 @Path("/v1/transaction") public interface SpectrAPI { @POST @Path("/spectra") Response evaluatePlanningDecisions(final Request request); } @Path("/v1/transaction") public interface JupiterAPI { @POST @Path("/jupiter") Response evaluatePlanningDecisions(final Request request); } // v2版本新增资源 @Path("/v2/payment") public interface BlazeAPI { @POST @Path("/blaze") Response handlePayment(final Request request); }
方案2:注册多Application实例(适合多版本逻辑隔离场景)
如果v1、v2版本需要独立配置拦截器、序列化规则等能力,可以定义两个独立的Application子类,分别配置不同的@ApplicationPath前缀:
// v1版本专属应用配置 @ApplicationPath("/v1") @Component public class V1ApplicationConfig extends Application { // 可单独注册v1版本的资源、过滤器、拦截器 } // v2版本专属应用配置 @ApplicationPath("/v2") @Component public class V2ApplicationConfig extends Application { // 可单独注册v2版本的资源、过滤器、拦截器 }
对应资源类无需再加版本前缀,自动归属到对应版本的上下文路径下:
// 归属于v1上下文的资源 @Path("/transaction") public interface SpectrAPI { @POST @Path("/spectra") Response evaluatePlanningDecisions(final Request request); } // 归属于v2上下文的资源 @Path("/payment") public interface BlazeAPI { @POST @Path("/blaze") Response handlePayment(final Request request); }
注意:Spring集成JAX-RS场景下需要配置两个Application实例的资源扫描范围,避免重复扫描导致路径冲突。
内容的提问来源于stack exchange,提问作者mitali
相关产品推荐
相关产品推荐

