我有一个版本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
扩展该抽象类?我该怎么办?
答案 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”,那么您可能需要复制代码或根据需要将其指向新版本。