2013-11-25 46 views
3

我已經通過定義供應商MIME類型在正確的accept頭被傳遞時工作正常的CXF實現了REST服務的版本控制。其餘版本使用MIME類型 - 默認版本*/*

但是,當客戶端沒有傳遞接受標頭但asterix/asterix時,我的服務默認返回服務的第一個版本。

好的,這是正確的,因爲客戶已經指定他們接受任何東西,但我希望它默認爲第二個最新版本的服務。

有沒有一種方法來指定此服務是在這種情況下應該使用的默認服務?

感謝

服務的一個註釋:

@GET 
@Path("/") 
@Produces(value = {CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V1}) 

服務兩個註解:

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

似乎JAXRS支持質量的加權的其他實現對於選擇權重較高的服務的情況,我找不到與CXF有關的任何內容。 。 –

回答

0

只需添加*/*

@Produces(value = {MediaType.WILDCARD, 
        MediaType.APPLICATION_JSON, 
        CustomMediaType.APPLICATION_CUSTOM_MEDIATYPE_JSON_V2}) 
+0

嗨Lutz,這仍然是返回第一個版本。由於客戶端接受所有的mimetypes,JAXRS將兩個候選方法都匹配起來,但它似乎總是選擇第一個。我希望它默認選擇我指定的那個。有任何想法嗎? –

1

解決方案BEL ow只會同時維護2個版本:

刪除舊版本(v1)的@Produces。

這將強制在v1上使用WildCard,因此在v2中您的@Produce將是較不具體的

  • 如果沒有MediaType,調度程序將選擇最具體的方法(因此,版本2)。
  • 對於MediaType版本1,唯一的匹配是通配符=> getObjectV1。
  • 隨着的MediaType第2版,在兩個匹配(V1和V2),但v2是更具體=> 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/