2012-02-21 33 views
3

我現在有一個使用Jersey的RESTful API,並且將它轉換爲符合OData標準。還有一些我還沒有轉換的東西,但會到達那裏,並且此時並不重要。我需要將其轉化的一個重要因素是關鍵路徑。奧達塔的標準是用圓括號包裝鑰匙。因此,在這個例子myapi.com/product(1) - 是OData調用來獲得一個產品,其ID爲1.目前,這是可能的在我的系統與此myapi.com/product/1澤西島和Odata關鍵路徑參數格式

當我添加圓括號到路徑參數我得到一個404錯誤。我的課程級別路徑是@Path(「/ product」),我的方法級別路徑是@Path(「({id})」),並用作@Path(「/ {id}」)。我嘗試添加圓括號作爲變量計劃的一部分,以便在方法中去除它們,並且我嘗試使用一些正則表達式@Path(「{id:regex stuff}」)來格式化該id,並且都不起作用。

如果我讓我的方法路徑參數像這樣@Path「/({id})」) - 所以調用是myapi.com/product/(1),它工作正常。括號不是明顯的問題。看起來澤西使用正斜線將路由拆分成塊,並且感覺在根資源名稱的id之間沒有正斜槓,則沒有發現任何東西。這說得通。

有沒有辦法改變JERSEYS匹配uri字符串與某些正則表達式或其他東西?有沒有人與奧達塔一起使用澤西島?我寧願不使用odata4j只是爲了解決這個問題,似乎應該有辦法讓這個工作。

我做了什麼: 基於帕維爾布切克的答案我做獨立實現ContainrRequestFilter到我使用安全過濾器。在我的情況下,我沒有看到是否存在,我只是試圖做替換。

try 
{ 
    String uriString = request.getRequestUri().toString(); 
    uriString = uriString.replaceAll("(\(|\)\/?)", "/"); 
    request.setUris(request.getBaseUri(), new URI(uriString)); 
} catch (final Exception e) 
{ 
} 
return request; 

回答

1

我認爲,最簡單的方法如何傳入URI與「/ $」處理這個「協議」將被引入ContainerRequestFilter,將取代「()$」。因此,您將能夠在一個應用程序中提供OData和標準REST請求。

參見http://jersey.java.net/nonav/apidocs/1.11/jersey/com/sun/jersey/spi/container/ContainerRequestFilter.html

簡單濾波器我用於測試這種情況下:

rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, new ContainerRequestFilter() { 
     @Override 
     public ContainerRequest filter(ContainerRequest request) { 
      try { 

       if(request.getRequestUri().toString().endsWith("(1)")) { 
        request.setUris(
          request.getBaseUri(), 
          new URI(request.getRequestUri().toString().replace("(1)", "/1"))); 
       } 

      } catch (Exception e) { 
      } 

      return request; 
     } 
    }); 


捲曲的 「http://本地主機:9998/HelloWorld的(1)」
捲曲的「http: // localhost:9998/helloworld/1「
現在命中相同的資源方法。 (顯然你需要改進當前的過濾器才能處理各種值,但它應該適合你)。

+0

我們已經有一個過濾器,所以我會看到關於添加它,並給它一個嘗試謝謝。我沒有考慮過這一點,因爲我認爲澤西在擊中過濾器之前確定了路徑 - 資源。 – Elrond 2012-02-22 15:14:51