2013-08-18 63 views
2

我嘗試使用jsonp數據類型執行ajax請求,這是由於跨羣集環境中的域問題導致的。如何通過JSONP請求使用@RequestBody?

我可以對沒有@RequestBody參數映射的方法發出jsonp請求,但是當我嘗試使用@RequestBody參數實現RequestMapping時,我得到一個415 Unsupported Media Type錯誤。

通常當我得到這個問題時,它是由於某些屬性在json對象發佈和它映射到Spring的Java對象之間沒有正確映射。但我能找到的惟一差異是使用jsonp它添加了一個名爲callback的parm,並且一個名稱爲下劃線「_」

因此,我將標記@JsonIgnoreProperties(ignoreUnknown = true)添加到了我的Java對象並計算那應該可以解決這個問題,但是它仍然會拋出這個錯誤。

還有什麼我需要做的嗎?

編輯:我現在看到的調試日誌輸出該堆棧跟蹤從春: org.springframework.web.HttpMediaTypeNotSupportedException:內容類型「應用程序/八位字節流」不支持

$.ajax({ 
    url : 'http://blah/blah.html', 
    data : { abc : '123' }, (I also tried to JSON.stringify the object but no difference) 
    dataType : 'jsonp', 
    success : function(response) { 
    alert('ok '+JSON.stringify(response)); 
    }, 
    fail : function(response) { 
    alert('error'+JSON.stringify(response)); 
    } 
}); 

春天控制器是:

@RequestMapping({ "blah/blah" }) 
@ResponseBody 
public ReturnObject getBlahBlah (@RequestBody MyObject obj) throws Exception { 

    } 

參數目的是:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class MyObject { 

    private String abc; 
    // getter and setter for abc auto generated by MyEclipse 
} 

我有一個從未命中的控制器方法的斷點。

回答

4

JSONP意味着jQuery將創建一個<script>元素,其中src指向您的控制器URL。

正如您所看到的,這種方法不允許您傳遞請求正文中的任何數據,所有數據都應作爲查詢參數傳遞到URL中。 data : { abc : '123' }表示abc=123已添加到URL中。

在控制器端,你需要爲使用@RequestParam(綁定inidividual參數)或@ModelAttribute(綁定多個參數爲對象):

public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception { ... } 
+0

謝謝你的澄清!我懷疑它是這樣的...好的,我會相應地改變它(從未使用ModelAttribute將多個參數組合到一個對象中,但那就是我將需要的)。我唯一的擔心是,由於查詢字符串長度限制(255個字符?),我會遇到許多parms問題。或者我可以使用POST方法類型與jsonp? – Trant

+1

JSONP僅GET - POST是不可能的。你可以編寫一個代理控制器來完成這個任務(你的AJAX通過POST調用應用程序中的控制器,然後將請求轉發給外部URI,然後將請求轉發回你的應用程序)。 – nickdos