【问题标题】:Matching resources in versioned API using Jersey使用 Jersey 匹配版本化 API 中的资源
【发布时间】:2015-10-29 15:16:15
【问题描述】:

我有一个 Jersey REST 服务,我正在寻找支持向后兼容性的版本控制。

我选择了“内容协商”选项,因为更改 URL 对我来说是一个困难的选择。服务版本添加在标头中并在服务器端标识。一些服务具有请求有效负载,而其他服务则没有。

我不确定我们如何为带有请求负载的服务实现版本控制。 Jersey 自动映射请求负载对象并对其进行解析。如果我需要两个不同的版本(版本在标头中标识),我们如何处理这两个请求有效负载并将它们路由到正确的服务版本?

【问题讨论】:

  • this question的可能重复
  • 不,这个问题不是重复的。其他问题和答案没有讨论请求有效负载的处理。事实上,Stackoverflow 中没有类似的问题。

标签: rest jersey


【解决方案1】:

您的方法的签名将告诉 Jersey 您如何处理请求输入。

将 Accepts-header 内容协商和 Content-type-header 内容协商放在一起,比较:

@POST    
@Produces("application/vnd.dis-feed-v2+json")
@Consumes("text/csv")
@Path("/wiGGits")
public String postEnrollmentsV2(String payload) 

@POST    
@Produces("application/vnd.dis-feed-v1+json")
@Consumes("text/xml")
@Path("/wiGGits")
public String postEnrollmentsV1(Document payload)

如果负载无法编组为 xml,Jersey 将在此 /wiGGits 服务的 v1 中生成 400 错误。

如果内容类型相同,并且您想拒绝与预期版本不匹配的对象版本,您还可以检查对象的内容是否存在版本差异

【讨论】:

    【解决方案2】:

    只需加上我的两分钱。 JAX-RS 2.0 specification(Jersey 实现的)非常清楚请求匹配的工作原理:

    3.7.2 请求匹配

    通过比较规范化的请求URI媒体,将请求匹配到相应的资源方法子资源方法任何请求实体的类型,以及资源类及其方法上的元数据注释请求响应实体格式。如果找不到匹配的资源方法或子资源方法,则返回适当的错误响应。 [...]

    除了找不到匹配的资源(类和方法)时生成的NotFoundException(404 状态)之外,适当的错误响应包括(再次引用JAX-RS 2.0 specification):

    • 如果没有方法支持请求方法,则实现必须生成 NotAllowedException(405 状态)且不生成实体。

    • 如果没有方法支持请求实体主体的媒体类型,则实现必须生成 NotSupportedException(415 状态)且不生成实体。

    • 如果没有方法支持可接受的响应实体主体媒体类型之一,则实现必须生成 NotAcceptableException(406 状态)且不生成实体。

    总之,当请求与您的资源不匹配时,您会收到相应的错误消息。


    如果需要,可以创建pre-matching filter,在请求匹配开始前执行。此过滤器允许您修改请求。您可以轻松更改请求的方法、请求的 URI 和请求的标头。

    为此,只需实现ContainerRequestFilter 并使用@PreMatching 对其进行注释:

    @Provider
    @PreMatching
    public class PreMatchingFilter implements ContainerRequestFilter {
    
        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
             // Use the requestContext to modify the request
        }
    }
    

    有关更多详细信息,请查看ContainerRequestContext API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多