【问题标题】:versioning rest service by creating abstract class?通过创建抽象类对休息服务进行版本控制?
【发布时间】:2016-01-12 22:06:32
【问题描述】:

我有一个 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 也扩展该抽象类?我应该如何进行?

【问题讨论】:

  • 我看不出这里有一个通用的基类有什么好处;而是将 v1 和 v2 之间的所有公共部分移动到您委派给的某个共享类,并使服务本身尽可能小。

标签: java rest versioning


【解决方案1】:

我对 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”为后缀,那么您可能需要复制代码或使其指向新版本,具体取决于您的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2013-04-13
    • 2012-05-07
    • 2015-06-29
    相关资源
    最近更新 更多