我有一个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网址的最佳方法是什么?我是否应该新建一个类,并像这样将@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”后缀,那么您可能需要根据需要复制代码或使其指向新版本。

07-24 09:49
查看更多