2016-08-15 19 views
-1

我必須編寫一個REST服務方法,該方法接受對象列表作爲參數來計算某些內容並返回結果。接受對象列表的Java REST服務

我到目前爲止有:

@RequestMapping(value = "generateBill/{id}/{rates}") 
public String generateBill(@PathVariable Long id, @PathVariable Rate rates[]) { 
    // do things 
    return "OK"; 
} 

但我相信,@PathVariable Rate rates[]是錯誤的。

我必須寫客戶端部分,我也不知道如何去做。這是我第一次寫這種REST服務方法。

編輯:房價看起來是這樣的:

public class Rate { 
    Long version; 
    Double amount; 
    Date validFrom; 
    Date validUntil; 
} 

回答

1

解決方案一:

@RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET) 
public String generateBill(@PathVariable Long id, @PathVariable Rate[] rates) { 
    // do things 
    return "OK"; 
} 

或者第二個(多個Java風格;)):

@RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET) 
public String generateBill(@PathVariable Long id, @PathVariable List<Rate> rates) { 
    // do things 
    return "OK"; 
} 

這一個你可以這樣的電話:

GET:http://localhost:8080/public/generateBill/1/1,2,3,4 凡1.2,3,4替換你的價值觀,這取決於OD那究竟是什麼價格;)


編輯

您的更新後,它看起來像你想擁有POST方法(你正在發佈費率列表),然後這裏已經回答了問題。 receiving json and deserializing as List of object at spring mvc controller

+0

好吧,所以我沒有錯; P但是作爲客戶?我如何傳遞網址中的列表? – diminuta

+1

如果有數組,則它將被轉換爲List;) – Hrabosch

+1

檢查我的編輯。但如果你需要傳遞你的對象,更好的是你使用的第一個解決方案;) – Hrabosch

1

其他解決方案是使用JSON字符串格式作爲參數,然後解析它。像

[
{
"rates":1, "name":"rate1" }, {
"rates":2, "name":"rate2" }, {
"rates":3, "name":"rate3" } ]

和之後的東西解析JSON到對象。

2

你應該把你的對象在POST請求的主體,而不是使用網址:

@RequestMapping(value = "generateBill/{id}", method = RequestMethod.POST) 
public String generateBill(@PathVariable Long id, @RequestBody BillingRequest billingRequest) { 
    // do things 
} 

而且,直接映射在有效載荷收集不演化(你不能添加新的「田」外數組),它通常是一個很好的做法來包裝你的數組中的一個JSON對象:

public class BillingRequest { 
    List<Rate> rates; 
    // Here you could add other fields in the future 
} 

你的HTTP請求來調用服務應該是這樣的:

POST/HTTP/1.1 
{ 
    "rates" : [ 
    { 
     "version" : 1, 
     "amount" : 33.3, 
     "validFrom" : "2016-01-01", 
     "validUntil" : "2017-01-01" 
    }, 
    { 
     "version" : 2, 
     "amount" : 10.0, 
     "validFrom" : "2016-02-01", 
     "validUntil" : "2016-10-01" 
    } 
    ] 
} 

最後一個忠告你的模型:

  • 使用java.time.LocalDate(或jodatime),而不是java.util.Date。如果您需要日期和時間,請使用java.time.ZonedDateTimeDateTime,如果您使用jodatime)
  • 使用java.math.BigDecimal表示確切的數字。浮點數如Doublecan lose precision
+0

非常感謝!我接受了另一個解決方案,因爲他先回答了,但我認爲你也應該接受,但我不能接受兩個.. – diminuta

相關問題