我正在努力使用 Jersey 创建 RESTful API。我想通过 Accept-Header 实现版本控制。我的资源(例如 MyResourceV1、MyResourceV2
和 SubresourceV1、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/