我试图弄清楚为什么在 Spring 时我无法接收来自 jQuery.ajax 调用的请求@Controller
处理程序方法包括@RequestBody
注解。考虑以下:
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。
为什么会这样呢? APOST
请求包含请求正文中的数据。注释不应该处理这样的请求吗?
我意识到我可以将 JavaScript 发送的内容类型更改为application/json
和consumes
财产给MediaType.APPLICATION_JSON_VALUE
使注释正确工作。但为什么它不适用于普通表单请求呢?
Note:我使用的是Spring 3.1.4。