2017-01-11 70 views
0

收集我見過很多類似地雷的問題,但是我無法找到一個解決這個問題爲止。春:綁定在控制器參數

我實現對Spring + Hibernate的網格過濾和分頁。方法load()必須接收用於分頁的特定參數(page,startlimit)和關鍵值參數列表,這是問題所在。

的參數來這樣的:

page:1 
start:0 
limit:23 
filter:[{"operator":"like","value":"tes","property":"desc"},{"operator":"like","value":"teste","property":"model_desc"}] 

或(編碼版本):

page=1&start=0&limit=23&filter=%5B%7B%22operator%22%3A%22like%22%2C%22value%22%3A%22tes%22%2C%22property%22%3A%22desc%22%7D%2C%7B%22operator%22%3A%22like%22%2C%22value%22%3A%22teste%22%2C%22property%22%3A%22model_desc%22%7D%5D 

濾波器參數來作爲一String,問題是使彈簧解析或者作爲例如ArrayList<Map<String,String>>ArrayList<SomeFilterClass>

這是我的控制器方法的簽名(註釋行都沒有工作,他們在這裏只是爲了展示一下我試過到目前爲止):

public Map<String, Object> loadData(@RequestParam(value = "page", required = true) int page, 
      @RequestParam(value = "start", required = true) int start, 
      @RequestParam(value = "limit", required = true) int limit, 
//   @ModelAttribute("filter") ArrayList<Map<String, String>> filter) { 
//   @RequestParam(value = "filter", required = false) Map<String, Object>[] filter) { 
//   @RequestParam(value = "filter", required = false) List<Map<String, String>> filter) { 
      @ModelAttribute("filter") RemoteFilter filter) 

這個類,RemoteFilter,是我構建的包裝類,遵循其他帖子的建議,但它並沒有工作。其結構是:

public class RemoteFilter { 

    private ArrayList<Filter> filter; 

    //Getters and Setters.... 

    class Filter { 
     private String operator; 

     private String value; 

     private String property; 

     //Getters and Setters.... 
    } 
} 

如果有人幫助我,我將非常高興。

謝謝!

+1

這聽起來像你是通過Ajax調用控制器,有沒有你使用GET任何原因(並有URL編碼JSON),而不是ofPOSTing和使用Spring @RequestBody到JSON轉換成Java對象? –

回答

1

嘗試發佈,而不是使用GET數據,當數據發佈春季只提供JSON到Java轉換。

{ 
    page:1 
    start:0 
    limit:23 
    filter:[{"operator":"like","value":"tes","property":"desc"},{"operator":"like","value":"teste","property":"model_desc"}] 
} 

而且具有控制器使用@RequestBody

@RequestMapping(method = RequestMethod.POST, value = "url", 
    produces = MimeTypeUtils.APPLICATION_JSON_VALUE, 
    consumes = MimeTypeUtils.APPLICATION_JSON_VALUE) 
public Map<String, Object> loadData(@RequestBody RemoteFilter filter) { 

} 

的響應使用Object作爲Map值類型。這會起作用,但使用一個不帶類型的返回值通常是一件壞事。

+0

嗨@KlausGroenbaek感謝您的回覆。忘了把'@ RequestMapping'註釋,但它是一個'POST'請求​​已:'@RequestMapping(值= 「/負載」,方法= RequestMethod.POST)'。我將它更改爲'@RequestBody(required = false)RemoteFilter filter',並且出現錯誤415(不支持的介質類型)。我發生這種情況是因爲在第一次加載時,參數過濾器沒有發送,這就是爲什麼必須設置爲false。 –

+0

415表示Content-type不正確。如果您從瀏覽器發佈它應該自動添加content-type = application/json,在Spring中配置控制器方法消耗和生成的內容。我會將其添加到答案中。 –

+0

它以'Content-Type:application/x-www-form-urlencoded;字符集= UTF-8'。但有一個問題,我仍然收到其他參數('page','start'和'limit')。 '@ RequestBody'仍然在這種情況下工作嗎? @RequestParam(value =「page」,required = false)int page, @RequestParam(value =「start」,required = false)int start, @RequestParam(value =「limit」,required = false)int限制, @RequestBody(required = false)RemoteFilter過濾器)' –