我试图弄清楚为什么当 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。然后,您将使用数据绑定(bind)(即 @ModelAttribute)将 Servlet 请求参数应用于对象字段。这比使用 FormHttpMessageConverter 更好。
关于Spring @MVC 和带有 x-www-form-urlencoded 数据的 @RequestBody 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16449141/