我有一个 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 url 的最佳方式是什么?我应该创建一个新类并将 @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”后缀,那么您可能需要复制代码或根据您的需要使其指向新版本。
关于java - 通过创建抽象类对其余服务进行版本控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754650/