使用Jersey匹配版本化API中的资源

时间:2015-10-29 15:16:15

标签: rest jersey

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

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

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

2 个答案:

答案 0 :(得分:0)

你的方法'签名将告诉泽西岛你如何看到它来编组请求输入。

使用Accepts-header内容协商和Content-type-header内容协商,比较:

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

VS

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

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

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

答案 1 :(得分:0)

加我的两分钱。 JAX-RS 2.0 specification(泽西岛实施的)非常清楚请求匹配的工作原理:

  

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。