2011-05-12 62 views
5

我已經設置了一個REST服務來訪問存儲在數據庫中的信息。具有多種類型的REST PathParam

我希望能夠根據項目的idname進行訪問。

因此,可以說我有一個記錄

name | id | description 
mine | 65 | "my thing" 

我希望能夠通過訪問此項目之一:

myurl.com/items/65 
myurl.com/items/mine 

我使用的是新澤西州(Java庫) 。有沒有一種方法,我可以定義PathParam接受一個int或String WITHOUT使用object.typeOf()?

我想避免這種情況:

@PATH("/items/{identifier} 
@GET 
public String getItem(@PathParam("identifier") Object identifier){ 
    if(identifier.typeOf().equals(String.typeOf())).... 

}

感謝

+0

你的意思是'.class'而不是'.typeOf()'? – Jeremy

+0

我只是自由地形成typeOf()位。 Mike的答案顯示了正確的Java語法。儘管如此。謝謝! –

+0

Jochen在下面提到了這一點,但值得強調的是:如果可以使用「4711」作爲名稱,則整個方案註定會失敗。所以請確保不會發生! :) – MatrixFrog

回答

4

如果你正在尋找一個 「乾淨」 的解決方案 - 我不認爲這是一個。但是,你可以這樣做:

@PATH("/items/{identifier}") 
public String getItem(@PathParam("identifier") String identifier){ 
    try { 
     return getByID(Long.parseLong(identifier)); 
    } catch (NumberFormatException ex) { 
     return getByName(identifier); 
    } 
} 

而且,這不會編譯 - 有沒有這樣的方法,typeOf()

if(identifier.typeOf().equals(String.typeOf())) 

我想你的意思是:

if (identifier instanceof String) 

編輯:無論如何,你最初的想法(設置參數類型爲Object,然後檢查確切的實例類型)將不起作用;容器無法知道path元素可能是一個整數,所以它不會試圖將其解析爲一個整數,並且它每次只會給你一個String

+0

+1如果需要,使用字符串和解析一個long是最乾淨的方式。 – fmucar

+0

試圖解析出「長」的好主意。謝謝! –

+3

除非有人來,並命名一個項目4711 ... –