java - 通过创建抽象类对其余服务进行版本控制?

标签 java rest versioning

我有一个 REST 服务,版本 v1 在生产中运行良好。现在我需要制作版本 v2 url,因为响应格式已更改,因此我们不想影响当前使用 v1 url 的客户。我们将使用版本 v2 url 返回一些其他对象,而不是使用 ClientResponse 对象。

下面是我当前的设计,其中@Path注释中提供了版本。这是由离开我们团队的其他人完成的。

@Component
@Scope("request")
@Path("/abc/hello/v1")
public class ClientService {

    // ... some variables

    @GET
    @Path("/json/line")
    @Produces(MediaType.APPLICATION_JSON)
    public ClientResponse getLineData(@Context UriInfo uriInfo) {


    }
}

这里设计版本 v2 url 的最佳方式是什么?我应该创建一个新类并将 @Path 作为 @Path("/abc/hello/v2") 像这样并复制粘贴其中的所有内容吗?或者我应该创建一些抽象类并让 ClientServiceV1 扩展该抽象类,然后让 ClientServiceV2 扩展该抽象类?我应该如何进行?

最佳答案

我的 REST API 版本控制策略是不让 JAX-RS 运行时自动确定要加载哪些 REST 资源,而是在 java.ws.rs.Application 实现中显式声明它们。

我的 java.ws.rs.Application 实现是我进行版本控制的地方,并在基本 API URI 中声明它

@javax.ws.rs.ApplicationPath("v1")
public class MyAppV1 extends java.ws.rs.Application {
    Set<Class<?>> getClasses() {
       return new java.util.HashSet<>(java.util.Arrays.asList(
           ClientService.class,
           OtherService.class));
    }
}

然后为“v2”创建另一个,我开始在那里添加我的组件。

其目的是我可以有多个版本,并且我可以弃用旧版本并最终根据需要删除它们。它还允许我重用现有的服务。

但是,如果您现有的服务带有“v1”后缀,那么您可能需要复制代码或根据您的需要使其指向新版本。

关于java - 通过创建抽象类对其余服务进行版本控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754650/

相关文章:

gwt - 如何从 Google Web Toolkit 进行 REST 调用?

javascript - token 身份验证 Rest API session

scala - 即使在增量编译中,SBT 1.3.8 也会自动更新 SNAPSHOT 版本

模式和数据的数据库版本控制和迁移技术

Java TreeMap containsKey 总是返回 true?

java - 在运行时与编译时构造 BigInteger

java - 在mysql中使用TIMEDIFF获取两个时间之间的差异时出现非法小时值错误

java - Javafx 中的选择性子变换

Rest EJB 项目未部署在 Wildfly 8.0 上

ruby-on-rails - 方法级别的 Rails API 版本控制