2012-11-26 52 views
3

我正在學習從STS儀表板下載的Spring MVS Showcase。我學習Spring如何將請求映射和我有一些問題要了解以下的事情:如何在Spring MVC中映射JSON對象?

我有這樣的形式提交按鈕:

 <li> 
      <form id="byConsumes" class="readJsonForm" action="<c:url value="/mapping/consumes" />" method="post"> 
       <input id="byConsumesSubmit" type="submit" value="By consumes" /> 
      </form> 
     </li> 

當我點擊提交按鈕jQuery的功能一個創建JSON目的通過HTTP POST請求通過,這是JQuery的功能的代碼:

$("form.readJsonForm").submit(function() {   

    var form = $(this);     // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento click (il form) 
    var button = form.children(":first");  // Seleziona il bottone submit 

    var data = form.hasClass("invalid") ?  // OPERATORE CONDIZIONALE: il form ha classe "invalid" ? 
      "{ \"foo\": \"bar\" }" :   // SI: foo = bar 
      "{ \"foo\": \"bar\", \"fruit\": \"apple\" }"; // NO: foo= bar ; fruit = apple 


    /* AJAX CALL PARAMETER: 
     type: Say to the servlet path, the request is a POST HTTP Request 
     url: The address to which to send the call 
     data: the content of my data variable 
     contentType: an object having JSON format 
     dataType: the type of content returned by the server 
    */ 
    $.ajax({ type: "POST", url: form.attr("action"), data: data, contentType: "application/json", dataType: "text", 
     success: function(text) { MvcUtil.showSuccessResponse(text, button); }, 
     error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }}); 

    return false; 
}); 

的JSON對象我已創建並通過由數據變量表示,並且包含以下項\值:{\ 「福\」:\ 「欄\」,\ 「水果\」:\ 「蘋果\」}

喜歡的東西:

富:酒吧

水果:蘋果

現在,在我的控制器我有一個處理此請求的方法:

@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) { 
    return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')"; 
} 

所以很顯然,我認爲這種方法處理HTTP POST請求對「製圖/消費」路徑(POST請求),但我不知道有關以下項目的含義:

  1. 消耗=的MediaType .APPLICATION_JSON_VALUE:這到底意味着什麼?我認爲它告訴Spring,這個方法接收一個JSON格式的對象,所以它可以用某種方式解析...但我不確定它,但我沒有在文檔中找到它。

    什麼是消耗?一個變量或類似註釋?我不理解的事情,因爲這是@RequestMapping註解的參數,但搜索在谷歌表示它是作爲一個獨立的註釋......

  2. 在我byConsumes()方法,我有以下輸入參數:@RequestBody JavaBean javaBean。 閱讀Spring文檔我明白:@RequestBody方法參數註釋表示使用@RequestBody註釋方法參數應該綁定到HTTP請求正文的值。

    所以在實踐中,這件事意味着我有我的JSON對象在我的HTTP請求正文字段中,並使用此註釋我將它轉換爲具有類JavaBean的名爲javaBean的對象?

    如果我的肯定是真的......什麼樣的對象是JavaBean類型的對象?一個只包含許多變量和相應的getter和setter方法的對象? (在previus情況下只包含兩個可變的對象:第一個名爲foo和具有值「欄」,第二個具有名稱水果和具有值「蘋果」)

是不是

非常感謝您 安德烈

回答

8

你的這是什麼代碼做解釋基本上是正確的。

'Consumes'是註釋@RequestMapping的參數,用於指示該方法處理的HTTP內容類型。在這種情況下,它向Spring表明該方法將JSON作爲輸入。你可以在Spring文檔here中閱讀更多。您可以同樣指出一種方法「消耗」XML。

至於@RequestBody註解,這用於指示應該從HTTP請求的主體組成的註解的方法參數,因爲它的文檔是here。 Spring通常會通過在請求中使用HTTP參數的名稱並使用setter方法在Java bean中設置值來完成此操作。

在您的示例中,Spring將檢查方法的註釋並確定請求主體應映射到類型爲JavaBean的對象。它將自動創建該類的實例,並且(通過消息轉換器)將填充JavaBean實例。 Spring將使用反射來完成這一切,但它執行的代碼將基本上做到這一點:

JavaBean parameter = new JavaBean(); 
parameter.setFoo("bar"); 
parameter.setFruit("apple"); 

你可以換出JavaBean類型聲明字段的foofruit getter/setter方法的任何其他Java類。

+0

非常感謝您對我們的優秀解釋!現在對我來說都很清楚:-) – AndreaNobili