java - 带有子资源定位器的 Jersey 版本控制

标签 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();
    }

但是,Jersey 似乎忽略了 @Produces 注释,这导致 Jersey 提示在同一路径上注册了多个资源:

[...] 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();
}

我看到的唯一解决方法是通过针对各个版本的不同方法将不同版本包含在同一文件中。这会不必要地使代码变得臃肿。有没有办法将我的版本分成文件并仍然保留我的子资源定位器?

最佳答案

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

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

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

关于java - 带有子资源定位器的 Jersey 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890699/

相关文章:

java - Netbeans maven-surefire-plugin 不生成 HTML

java - 如何正确地将格式化的日期时间传递到 HTTP 请求中?

java - 测试 Camel REST DSL 消费者模板

java - 外部服务的创建 API。发送二进制数据

java - 我应该为我的库存系统使用静态列表吗?

java - 为什么MemUsage值会随着时间的推移而增加?

java - Jaxrs (RESTEasy) @Path regexp 中的多个子资源

javascript - java 类的 JSON 架构

java - 单击按钮后在弹出窗口中显示图像 - Android/Java

.net - 在多个.NET应用之间进行通信的最有效方法