使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制
Posted
技术标签:
【中文标题】使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制【英文标题】:Versioning REST API using Guice 3.0 + JaxRS 2.0 【发布时间】:2014-02-07 19:44:47 【问题描述】:我想要一个使用 HTTP 请求标头的版本化 REST api:
GET /someResource
版本:1.0
现在,如果我有此资源的 2 个版本,我的 JaxRS Web 应用程序需要能够提供适合任一请求版本的响应。因此,我希望以下类成为我的类路径的一部分:
@Path("/someResource")
public class SomeResourceV1
**snip**
和
@Path("/someResource")
public class SomeResourceV2
**snip**
现在我想根据 Version 标头将请求分派到这些资源类之一。我假设这将使用 servlet 过滤器来完成。但由于我使用的是 Guice,我认为我正在寻找的是一个按请求注入器。
如果请求的版本为 1.0,则使用带有 SomeResourceV1 绑定的注入器 否则,如果请求的版本为 2.0,则使用带有 SomeResourceV2 绑定的注入器
我认为有一种方法可以通过继承 GuiceFilter 来获得我想要的东西,但我并不完全确定。有没有人尝试过这样的事情?
【问题讨论】:
您介意分享一下您是如何解决这个问题的吗? @RahulDabas 我已经有一段时间没有解决这个问题了。如果没记错的话,我相信我们使用了类似于 Xavier 建议的东西,尽管我们利用 profile 参数来确定要使用的资源的版本。如果我今天再做一次,我可能会部署 2 个独立版本的应用程序并使用 api 网关来选择如何将用户请求路由到正确的支持服务。祝你好运! 【参考方案1】:不完全是您要求的,但您可以在请求媒体类型中包含版本(例如:application/vnd.foo.v1+json
- vnd
指定自定义供应商类型,+json
允许 JAX-RS 实现知道传入的请求实体是 JSON 格式)。
然后,您可以在每个方法上使用 @Consumes
注释进行调度(例如:@Consumes("application/vnd.foo.v1+json")
与 @Consumes("application/vnd.foo.v2+json")
,而无需添加自定义过滤器。
【讨论】:
感谢 Xavier,我考虑过媒体类型,但我倾向于同意 Joe:***.com/a/11923744/1028367 此外,我不太喜欢在同一类中混合 2 个版本的代码的想法。我可能会不小心更改 V1 代码路径上的某些内容,无意中破坏了 V1 消费者。如果请求 V2,我真正想要的是不绑定 V1 或将其作为 jaxrs 资源公开。以上是关于使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制的主要内容,如果未能解决你的问题,请参考以下文章
jersey 2.0 jaxrs RI - 在异常时返回 json 字符串