2011-05-05 133 views
17

也許這應該是行不通的,但至少我想明白爲什麼。我在PUT body中傳遞了一個簡單的val = somevalue,但是spring發回400 Bad Request,因爲它似乎沒有識別val參數。如果使用PUT,SpringMVC無法識別請求身體參數

相似的請求使用POST。難道是SpringMVC不認識PUT請求身體作爲參數的來源嗎?

Content=-Type在兩種情況下都正確設置爲application/x-www-form-urlencoded。

春天拒絕調用的方法是這樣的:

@RequestMapping(value = "config/{key}", method = RequestMethod.PUT) 
@ResponseBody 
public void configUpdateCreate(final Model model, @PathVariable final String key, @RequestParam final String val, 
     final HttpServletResponse response) throws IOException 
{ 
    //... 
} 

爲了完整起見,這裏是jQuery的AJAX調用。我看不出有什麼問題。客戶端是Firefox 4或Chrome,都顯示相同的結果。

$.ajax({ 
     url:url, 
     type:'PUT', 
     data:'val=' + encodeURIComponent(configValue), 
     success: function(data) {...} 
     });  

任何想法?

+0

當它更改爲POST時,它會工作嗎? – 2011-05-05 12:30:33

+0

爲什麼用@ResponseBody在void方法中註釋該方法?該註釋應該表明返回類型應直接寫入HTTP響應主體。我認爲情況並非如此。你可以嘗試這樣做,以及:數據:{「VAL」,encodeURIComponent方法(configValue)}, – Javi 2011-05-05 14:53:10

+0

那是什麼回來與400代碼錯誤消息? – skaffman 2011-05-05 17:06:06

回答

19

我不知道在這一點周圍的工作,但這裏是bug報告這是一個「不會固定。」我一直在爭取同樣的問題

https://jira.springsource.org/browse/SPR-7414

更新:這是我的修正。我正在使用RequestBody註釋。然後使用MultiValueMap。

http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/mvc.html#mvc-ann-requestbody

@RequestMapping(value = "/{tc}", method = RequestMethod.PUT) 
public void update(@PathVariable("tc") final String tc, 
@RequestBody MultiValueMap<String,String> body, HttpServletResponse response) { 

    String name = body.getFirst("name"); 
// more code 
} 
+1

另見:http://markmail.org/thread/bqb44tqnhmvtlji6 – 2011-10-24 16:15:41

+0

感謝您的鏈接的討論Tomcat的名單上,它澄清了問題。在我的情況與@RequestBody註釋的解決方案沒有用自定義模型/格式支持bean類的工作,而不是多重映射。所以我使用的HiddenHttpMethodFilter,我從jQuery的發送POST請求包括_method =把PARAM代替,如PHP編碼器建議。 – meyertee 2011-12-14 14:03:03

1

我沒有合適的解決方案適合你,但你的情況我嘗試以下操作:

  • form:form method="PUT"
  • 創建頁面申報HiddenHttpMethodFilterweb.xml

要是這樣的作品,那麼

  • 變化typePUTPOST在Ajax調用
  • 添加所需的PARAMS該客戶端具有form:form標籤(像_method

換句話說,我的理解春季基於簡單POST特定參數模擬PUT。只要發給他他想要的東西。

參見:http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/和相關的代碼示例有:http://code.google.com/p/spring-finance-manager/source/browse

HTH

1

此,如上述建議,似乎是在spring/servlet API的錯誤。實際上,PUT請求應該在Request Body (or payload)上工作,而不是在請求參數上。從這個意義上說,servlet API & spring的處理是正確的。

說了這麼多,更好的和更容易的解決辦法是沒有數據元素從javascript/jQuery呼叫傳遞並通過您的參數作爲URL本身的一部分。意思是,你可以在GET調用中設置url字段中的參數。

$.ajax({ 
      url: "yoururl" + "?param1=param2Val&..", 
      type: "PUT", 
      data: "", 
      success: function(response) { 
       // .... 
      } 
    }); 

現在這適用於簡單的參數,我猜,將不適用於複雜的JSON類型。希望這可以幫助。

12

Since春季3.1,這是使用org.springframework.web.filter.HttpPutFormContentFilter解決。

<filter> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <servlet-name>rest</servlet-name> 
</filter-mapping> 
+1

你是我的英雄! – 2014-03-26 18:36:45

+0

這將進入您的web.xml – tibi 2016-12-13 11:33:12