我有Jersey REST服务,我正在寻找版本控制以支持向后兼容性。
我选择了“内容协商”选项,因为更改网址对我来说是一个困难的选择。服务版本添加到标头中并在服务器端标识。一些服务有请求有效载荷而其他服务没有。
我不确定如何使用请求有效负载实现服务的版本控制。 Jersey自动映射请求有效负载对象并对其进行解析。如果我需要有两个不同的版本(标题中标识了版本),我们如何处理两个请求有效负载并将它们路由到正确的服务版本?
答案 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。