我试图弄清楚为什么当 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>
爪哇:
@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。