通过创建抽象类来版本化休息服务?

时间:2016-01-12 22:06:32

标签: java rest versioning

我有一个版本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版本的最佳方法是什么?我应该创建一个新课程并将@Path作为@Path("/abc/hello/v2")这样复制粘贴其中的所有内容吗?或者我应该创建一些抽象类并使ClientServiceV1扩展该抽象类,然后让ClientServiceV2扩展该抽象类?我该怎么办?

1 个答案:

答案 0 :(得分:2)

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