2017-03-02 117 views
1

我有如下的REST端點類:兩個GET方法與不同數量的查詢參數:REST

@Path("/sports") 
public interface SportsEndpoint { 

    @GET 
    List<Player> getPlayersOfSports(@QueryParam("sportId") String sportId, @QueryParam("sportName") String sportName); 


    @GET 
    List<Player> getPlayersOfSports(@QueryParam("sportId") String sportId, @QueryParam("sportName") String sportName, @QueryParam("country") String country); 

} 

正如你所看到的,我有幾乎相同的特徵,除了第二個方法二GET方法需要額外的QueryParam

我嘗試使用URL來訪問這些端點:

http://localhost:8080/rest/api/sports?sportId=100&sportName=badminton http://localhost:8080/rest/api/sports?sportId=100&sportName=badminton&country=japan

兩種這些URL解析爲使用第一種方法的簽名。理想情況下,我期待第一個url,第一個方法簽名將被調用,第二個url第二個方法(帶有3個查詢參數的那個)將被調用。
但看起來在這兩種情況下,第一種方法正在調用。

我知道Rest資源由路徑唯一標識,而不是查詢參數。但是,即使查詢參數的數量不同,其餘端點也不會被唯一標識嗎?
有人可以指點一些規範/文章/文檔,我可以在設計rest api終結點時瞭解多態性嗎?

僅供參考:我正在使用RestEasy。

+0

總之,Jax-Rs使用路徑信息來解析調用的方法。如果多個方法可能匹配使用的第一個方法。你可以做的是刪除第一個方法,因爲它已經被第二個方法覆蓋,並檢查裏面的最後一個參數是否爲空。由於查詢參數被視爲可選參數(如果它們不可用),您的框架應該注入一個空值(或者如果您指定了一個,則爲默認值) –

回答

1

QueryParams是可選的PARAMS作爲

你正確地指出我知道休息資源是唯一 路徑標識,而不是查詢參數

,並回答你的問題,

是即使查詢參數的數量不同,第餘下的 端點將不會被唯一標識?因爲它是由 路徑而不是查詢參數標識的。

如果你想你的方法應根據被稱爲輸入在沒有你的querystring 最好是建立一個單一的方法,根據您的要求這需要所有的queryparam並基於沒有投入如果提供,您分別調用每種方法。

所以你的情況,它可以改寫如下: -

@Path("/sports") 
    public interface SportsEndpoint { 

     @GET 
     List<Player> getPlayers(@QueryParam("sportId") String sportId, @QueryParam("sportName") String sportName , @QueryParam("country") String country){ 
if(sportId ! =null && sportName!=null) 
{ 
getPlayersOfSports(sportId,sportName); 
} 
else if (sportId ! =null && sportName!=null && country!=null) 
{ 
getPlayersOfSports(sportId,sportName,country); 
} 
} 

而且

那麼你定義的方法,你的業務邏輯,這 將有2個重載方法重載,這根據參數的不同而變化。 這樣你就可以實現多態。

+0

Upvoting您的答案並將其標記爲正確的答案。 –

+0

@RITZXAVI謝謝。 –

1

其餘的Java API是實現JAX-RS的,據我所知,這樣你就可以讀Jax-Rs specification

JAX-RS映射路徑資源的方法。資源方法必須具有唯一的路徑。查詢參數不被視爲路徑的一部分。資源方法是使用請求方法標識符註釋的資源類的方法。這不是由規格決定,當兩個方法共享相同的指示符和路徑時應該發生什麼,但大多數實現將只使用其中一個,並且不會報告錯誤。

(符合與URL specs。)

這意味着你不能使用重載。

允許繼承。從JAX-RS規格:

JAX-RS註釋可以在一個超類或實現的接口的方法和方法參數來使用。只要方法及其參數沒有任何JAX-RS註釋,這些註釋就會被相應的子類或實現類方法繼承。超類的註釋優先於實現接口上的註釋。如果子類或實現方法具有任何JAX-RS註釋,則將忽略超類或接口方法上的所有註釋。例如。:

+0

這並不回答我的問題。我知道如何使用查詢參數。我不是這樣問的。我想知道多態性在設計休息端點時是如何工作的,以便可以理解爲什麼我的第二個方法永遠不會被調用,即使我傳遞了3個查詢參數。 –

+0

我編輯了答案 –

+0

Upvoting你的答案。 –