使用Mime类型进行REST版本控制 - 对于*/*的默认版本。

3
我已经使用CXF在我的REST服务中实现了版本控制,通过定义厂商MIME类型,在正确的接受标头被传递时可以正常工作。
然而,当客户端没有传递接受标头但使用星号/星号时,我的服务会默认返回服务的第一个版本。这是正确的,因为客户端指定可以接受任何内容,但我想它默认返回服务的第二新版本。
是否有一种方式可以指定在这种情况下应该使用此服务作为默认服务?
谢谢
Service One Annotation:
@GET
@Path("/")
@Produces(value = {CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V1})

服务二注释:

@GET
@Path("/")
@Produces(value = {MediaType.APPLICATION_JSON,CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V2})

看起来JAXRS的其他实现支持质量加权,以选择更高加权的服务,然而我找不到与CXF相关的内容。 - Chris Jones - Belgium
2个回答

1
下面的解决方案仅适用于同时维护2个版本的情况:
删除旧版本(v1)的@Produces。
这将强制在v1上使用WildCard,因此它将比v2中的@Produces更不具体。
  • Without MediaType, the dispatcher will pick up the most specific method (therefore, version 2).
  • With MediaType Version 1, the only match would be the wild card => getObjectV1.
  • With MediaType Version 2, there is two matches (v1 and v2) but v2 is more specific => getObjectV2

    @GET
    @Path("/")
    public Object getObjectV1(){
    }
    
    @GET
    @Path("/")
    @Produces(value ={CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V2})
    public Object getObjectV2(){
    }

http://bill.burkecentral.com/2013/05/29/the-poor-jax-rs-request-dispatching-algorithm/


0
只需添加*/*
@Produces(value = {MediaType.WILDCARD,
                   MediaType.APPLICATION_JSON,
                   CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V2})

嗨Lutz,这仍然返回第一个版本。由于客户端接受所有MIME类型,JAXRS将两者都匹配为可能的候选方法,但似乎总是选择第一个。我希望默认选择我指定的那个。有什么想法吗? - Chris Jones - Belgium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接