如果使用PUT,SpringMVC无法识别请求身体参数
也许这应该是行不通的,但至少我想明白为什么。我在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) {...}
});
任何想法?
我不知道在这一点周围的工作,但这里是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
}
另见:http://markmail.org/thread/bqb44tqnhmvtlji6 – 2011-10-24 16:15:41
感谢您的链接的讨论Tomcat的名单上,它澄清了问题。在我的情况与@RequestBody注释的解决方案没有用自定义模型/格式支持bean类的工作,而不是多重映射。所以我使用的HiddenHttpMethodFilter,我从jQuery的发送POST请求包括_method =把PARAM代替,如PHP编码器建议。 – meyertee 2011-12-14 14:03:03
我没有合适的解决方案适合你,但你的情况我尝试以下操作:
- 与
form:form method="PUT"
- 创建页面申报
HiddenHttpMethodFilter
在web.xml
要是这样的作品,那么
- 变化
type
从PUT
到POST
在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
此,如上述建议,似乎是在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类型。希望这可以帮助。
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>
你是我的英雄! – 2014-03-26 18:36:45
这将进入您的web.xml – tibi 2016-12-13 11:33:12
当它更改为POST时,它会工作吗? – 2011-05-05 12:30:33
为什么用@ResponseBody在void方法中注释该方法?该注释应该表明返回类型应直接写入HTTP响应主体。我认为情况并非如此。你可以尝试这样做,以及:数据:{“VAL”,encodeURIComponent方法(configValue)}, – Javi 2011-05-05 14:53:10
那是什么回来与400代码错误消息? – skaffman 2011-05-05 17:06:06