2016-08-03 72 views
0

我在JQuery 1.8的HTML頁面中有一個按鈕。 我正在使用Spring MVC 4.1來處理請求。Spring MVC&JQuery AJAX Post只能使用@ResponseBody

 var test= "foo"; 
     $.ajax({ 
      type : "POST", 
      async : false, 
      url : "rest/ping", 
      data : JSON.stringify(test), 
      dataType : "json" , 
      contentType : "application/json", 
      error : function(jqXHR, textStatus, errorThrown) { 
       alert(errorThrown + " -- " + jqXHR.responseText); 

      }, 
      success : function(data) { 
       console.log("bar"); 
      } 
     }); 

彈簧側:

@Controller 
@RequestMapping("/test") 
public class DummyController { 
@RequestMapping(value = "/rest/ping", method = RequestMethod.POST) 
@ResponseBody 
public void ping(@RequestBody String test) throws ServiceException{ 
    // nothing of concern 
} 
} 

如果我刪除的@ResponseBody系統無法找到映射。如果我在請求主體註釋中添加'(required = false)',則映射被找到,但是ajax調用失敗,因爲調用映射的url之後,系統調用「test/rest/ping/rest/ping」。

如果您有關於JQuery和Spring MVC協同工作的文檔,請將它們添加到此問題中。我無法找到描述這種奇怪行爲的有效示例。 如果您有任何問題,請詢問。 謝謝大家的時間。

+0

你能提供整個控制器的代碼嗎?它可能與它的註釋不一致。 – tonnoz

回答

2

@ResponseBody是需要的,因爲你正在通過JQuery進行XHR調用。對於將返回特定數據格式(JSON,XML)的端點,對於不返回任何數據的端點(void)也是如此。

否則,當未指定時,Spring會要求返回一個ModelView對象,該對象將指向特定的視圖,並且可以使用模型哈希對其進行修飾。

在你的情況下,問題可能是在JSON.stringify(test)你不在的形式提供有效的鍵值對: test=yourValue

欲瞭解更多信息有關Responsebody你可以檢查this one

希望它有幫助。

0

你可以嘗試以下變化

卸下控制器的@RequestMapping( 「/測試」)。如果你仍然想保留它,那麼也包括在AJAX中作爲測試/休息/ ping