通过创建抽象 class 来对其余服务进行版本控制?

versioning rest service by creating abstract class?

我有一个版本为 v1 运行 的 REST 服务在生产环境中运行良好。现在我需要制作版本 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 的最佳方法是什么?我是否应该像这样制作一个新的 class 并将 @Path 设为 @Path("/abc/hello/v2") 并复制粘贴其中的所有内容?或者我应该创建一些抽象 class 并让 ClientServiceV1 扩展那个抽象 class 然后让 ClientServiceV2 扩展那个抽象 class 吗?我该如何进行?

我对 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" 后缀,那么您可能需要根据需要复制代码或使其指向新版本。