如果使用PUT,SpringMVC无法识别请求体参数

也许这应该不起作用,但至少我想了解为什么。 我在PUT体中传递一个简单的val = somevalue但是spring发回400 Bad Request因为它似乎没有识别val参数。

类似的请求适用于POST 。 可能是SpringMVC没有将PUT请求体识别为参数源吗?

在两种情况下, Content=-Type都正确设置为application / x-www-form-urlencoded。

spring拒绝调用的方法是:

 @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) {...} }); 

有任何想法吗?

我现在还不知道有什么工作,但这里的错误报告是“不会修复”。 我一直在打同样的问题

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 body, HttpServletResponse response) { String name = body.getFirst("name"); // more code } 

从 Spring 3.1开始,使用org.springframework.web.filter.HttpPutFormContentFilter解决了这个问题。

  httpPutFormContentFilter org.springframework.web.filter.HttpPutFormContentFilter   httpPutFormContentFilter rest  

我没有适合您的解决方案,但在您的情况下,我尝试以下方法:

  • 使用form:form method="PUT"创建页面form:form method="PUT"
  • web.xml声明HiddenHttpMethodFilter

如果这样可行,那么

  • 在ajax调用中将typePUT更改为POST
  • 添加客户端具有form:form所需的参数form:form标签(类似于_method

换句话说,据我所知,Spring基于带有特殊参数的简单POST模拟PUT 。 只要发给他他想要的东西。

另请参阅: http : //stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/及相关代码示例: http : //code.google.com/p/spring -财务经理/源/浏览

HTH

如上所述,这似乎是spring/servlet API一个错误。 实际上, PUT请求应该在Request Body (or payload)上工作,而不是在Request Parameters上工作。 从这个意义上说,servlet API和spring的处理是正确的。

话虽如此,更好,更简单的解决方法是从javascript/jQuery调用中传递数据元素,并将您的参数作为url本身的一部分传递。 意思是,在url字段中设置参数,就像在GET调用中一样。

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

现在这适用于简单的参数,我猜,它不适用于复杂的JSON类型。 希望这可以帮助。