2014-01-17 64 views
0

我試圖從jsp中將jquery-ajax的POST數據傳遞給我的Spring-MVC控制器函數。數據傳遞的很好,當我使用String對象接收RequestBody時,我可以打印JSON數據。 但是,當我使用一個DTO它具有自己的對象控制器返回一個「415不支持的媒體類型錯誤」用下面的語句聲明數組變量,在AJAX-Spring中不支持的媒體類型錯誤

服務器拒絕,因爲請求該請求實體的格式不被所請求方法的請求資源支持。

下面給出的是DTO類

public class anyClassDTO{ 
      private String name; 
      private List<anyClassDTO> subList = new ArrayList<anyClassDTO>(); 

       //getters and setters here 
    } 

現在,這裏是從JSP頁面接收控制器功能

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST) 
public @ResponseBody 
String addData (HttpServletRequest request, 
       @RequestBody List<anyClassDTO> dtoObject,  
       Model model) 
{  
    return "{\"value\":\"true\"}"; 
} 

是沒可能的對象列表通過AJAX控制器?

在這裏被從JSP通過了一組樣本數據的

[{ 「名稱」: 「模塊1」, 「子列表」:[{ 「名稱」: 「第1章」, 「子列表」: [{ 「名稱」: 「subchapter1」, 「子列表」:空}]}]},{ 「名稱」: 「模塊2」, 「子列表」:[{ 「名稱」: 「第1章」, 「子列表」:[{ 「名」: 「subchapter1」, 「子列表」:空}]}]}]

+0

對於我認爲你遇到的問題,這是一個奇怪的錯誤。如果您向我們提供您正在使用的Spring版本,它可能會有所幫助。 –

+0

春天的版本是3.1和傑克遜映射庫是2.3.0 – evyavan

+0

@SotiriosDelimanolis你能告訴我你認爲我有什麼'那個'問題嗎? – evyavan

回答

1

確保您的AJAX請求將請求的Content-Typeapplication/json

當您指定@RequestBody時,Spring通常會使用MappingJacksonHttpMessageConverter來轉換請求主體。這HttpMessageConverter只支持application/*+json類型的內容類型,所以你必須確保你的請求包含它。

+0

在AJAX調用中,我們已經設置了以下內容:_beforeSend:function(xhr){{0} xhr.setRequestHeader(「Accept」,「application/json」); xhr.setRequestHeader(「Content-Type」,「application/json」); } _ – evyavan

+0

@evyavan編輯您的文章並添加您的AJAX。我試着用你的代碼,它的工作原理。你不需要中間的DTO。您還可以設置您的記錄器進行調試,以查看Spring漏洞的位置。 –

0

那麼,我們可以通過添加更多的細節來使其工作。我沒有將@ResponseBody作爲List對象接收,而是創建了另一個包含原始DTO List對象的DTO。所以第二個DTO基本上是一個虛擬的,它接收來自AJAX的數據作爲單個對象。

就像我在問題已經說過我有一個DTO如下

public class AnyClassDTO{ 
     private String name; 
     private List<anyClassDTO> subList = new ArrayList<anyClassDTO>(); 

      //getters and setters here 

}

我創建另一個DTO保持的上述DTO

列表
public class DummyDTO{ 
     private List<AnyClassDTO> dummyObj; 

     //getters and setters here 
} 

然後,在控制器我將功能更改爲

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST) 
public @ResponseBody 
String addData (HttpServletRequest request, 
      @RequestBody DummyDTO dummyDTOObj,  
      Model model) 
{  
     return "{\"value\":\"true\"}"; 
} 

早些時候,如果我直接從AJAX發送一個列表,現在我正在發送一個字符串化的字符串,其中包含一個包含整個數據的變量。

它就像一個魅力!

相關問題