我试图弄清楚为什么当Spring @Controller
处理程序方法包括@RequestBody
批注时,我无法从jQuery.ajax调用接收请求。考虑以下:
HTML/JavaScript :
<form id="foo" action="/baz">
<input name="bar">
</form>
<script>
$(function() {
var $fooForm = $('#foo');
$fooForm.on('submit', function(evt) {
evt.preventDefault();
$.ajax({
url: $fooForm.action,
data: $fooForm.serialize(),
dataType: 'json',
type: 'POST',
success: function(data) { console.log(data); }
});
});
});
</script>
Java :
@RequestMapping(
value = "/baz",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
@RequestBody FormDataObject formData)
{
return this.searchService.find(formData);
}
上面的操作会失败,并带有
@RequestBody
批注,并返回415错误(不会生成异常)。但是,如果删除了@RequestBody
批注(即参数签名只是FormDataObject formData
),则将调用该方法,并将JSON返回到JavaScript。为什么会这样呢?
POST
请求将数据包含在请求的主体中。注释处理不应该这样吗?我意识到我可以将JavaScript发送的内容类型更改为
application/json
,并将consumes
属性更改为MediaType.APPLICATION_JSON_VALUE
,以使注释正常工作。但是,为什么它不能与普通表单请求一起使用?注意:我正在使用Spring 3.1.4。
最佳答案
您是否尝试过登录'org.springframework.web'来找出返回状态代码的原因?在将其转换为415之前,应该引发并记录该异常。
另外,如果发送表单数据,为什么不直接删除@RequestBody。然后,您将使用将Servlet请求参数应用于对象字段的数据绑定(bind)(即@ModelAttribute)。这比使用FormHttpMessageConverter更可取。
关于Spring @MVC和带有x-www-form-urlencoded数据的@RequestBody批注?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16449141/