2011-07-07 60 views
4

在RestEasy的這個...Java使用註釋命名/可選參數?

@GET 
@Path("request") 
public String requestJson(@QueryParam("arg1") @DefaultValue("") String arg1, 
          @QueryParam("arg2") @DefaultValue("0") Integer arg2); 

...允許您定義的方法簽名定義的參數任何子集。當然,然後可以在任何方法簽名上使用相同的圖案,例如:

@Method 
public String requestJson(@OptionalParameter("arg1") @DefaultValue("") String arg1, 
          @OptionalParameter("arg2") @DefaultValue("0") Integer arg2); 

是否可以這樣做?如果是這樣如何?

+1

註解(這是從JSR311,順便說一句)只是告訴容器(RestEasy的在這種情況下)注入一個值,如果參數爲空,這是可選的命名參數有很大不同,這是不是Java支持。 – Dmitri

回答

3

RESTEasy示例中的註釋是可能的,因爲該對象由RESTEasy框架管理。它可以檢查該方法並根據這些註釋確定如何調用它。可以創建任何您想要的註釋,關鍵是調用該方法的代碼需要了解註釋以及如何處理它們。

3

首先,@laz說的完全正確。這在RESTEasy中是可行的,因爲RESTEasy正在管理對你班級的呼叫。

我認爲這裏的相關問題就是你期待requestJson()的調用的樣子。一些示例:requestJson(1)requestJson("String")而諸如requestJson(null, 1)requestJson("String", null)之類的東西。

有五種方法我能想到的處理這個問題:

  1. 最低自動化的方式(但最終,最好的辦法):寫的變異方法自己手工或設置您的IDE以便產生他們。

  2. 讓它調用者負責將值設置爲默認值,如果它沒有一個(即主叫方決定「我打電話其中有一個方法」

  3. 攔截調用requestJson()並根據需要插入缺少的值(這會導致一些混亂的反射或運行時代碼生成voodoo;這是可能的,但它不會很簡單 - 基本上,您正在構建自己的AOP庫,它將管理所有調用requestJson())

  4. 插件到編譯器/構建鏈以生成所需的方法,即:

    public String requestJson() { requestJson("", 0); } 
    public String requestJson(String arg1) { requestJson(arg1, 0); } 
    public String requestJson(Int arg2) { requestJson("", arg2); } 
    public String requestJson(String arg1, Int arg2) {...} 
    

    (這類似於什麼discussed here

  5. 添加代碼來確定缺失值您requestJson執行的頂部。這隻會啓用requestJson(null, 1)之類的東西,它可能不是你要找的東西(因爲它需要額外的requestJson())處理。可能將鍋爐板提取到庫中。

+0

感謝您的回覆。事實上,我事前已經考慮過你提到的大多數方法。我想我希望看到'requestJson'被調用的方式就像'@method requestJson(@param({name =「arg1」,value =「1」})''註釋'@method'可以反映方法它包裝,提取方法簽名中的參數數量,然後根據任何缺失參數的要求內部重載方法,然後將任何'@param'註釋中定義的值傳遞給重載方法。這種方式? – travega

+0

您使用的語法似乎在調用該方法的位置具有批註,而該批註不會編譯。 – ig0774