使用子资源定位器进行泽西版本控制

时间:2017-10-23 13:33:45

标签: java rest jax-rs versioning jersey-2.0

我正在使用Jersey创建RESTful API。我想通过Accept-Header实现版本控制。我的资源(例如MyResourceV1, MyResourceV2SubresourceV1, SubresourceV2)分为不同的类。现在我正在使用内容类型application/vnd.myapp.resource.v1+json,因为Jersey识别自定义媒体类型,因此适用于常规资源。

@GET
@Path("/list")
@Produces("application/vnd.myapp.resource.v1+json")
public List<MyResourceV1> getProjectList() {
//returns JSON
}

现在MyResource实现子资源SubResource

@Path("/{resourceId}/subresource/")
    @Produces("application/vnd.myapp.subresource.v1+json")
    public SubResourceV1 getSubResource() {
        return new SubResourceV1();
    }

然而,泽西岛似乎忽略了@Produces注释,导致泽西岛抱怨在同一条路径上注册了多个资源:

[...] and resource Resource{"/{resourceId}/subresource/", 0 child resources, 0 resource methods, 1 sub-resource locator, 1 method handler classes, 0 method handler instances}, contains sub resource locators on the same path /{resourceId}/subresource/.

因为MyResourceV2包含相同的路径:

@Path("/{resourceId}/subresource/")
@Produces("application/vnd.myapp.subresource.v2+json")
public SubResourceV2 getSubResource() {
    return new SubResourceV2();
}

我看到的唯一解决方法是通过相应版本的不同方法将不同版本包含在同一文件中。这不必要地使代码膨胀。有没有办法让我的版本分成文件并仍保留我的子资源定位器?

1 个答案:

答案 0 :(得分:0)

我认为除了你认为必须做的事情之外别无选择(所有方法都有一个子资源)

jax rs规范说子资源定位器基本上只负责为jaxrs容器提供所述子资源的合适实现。

关于接受匹配和子资源定位器,AFAICT中没有任何内容。