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