Jam*_*ers 9 jquery spring spring-mvc
我试图弄清楚为什么我不能从jQuery.ajax调用接收请求,然后Spring @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>
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
以上将失败并且@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请求参数应用于对象字段的数据绑定(即@ModelAttribute).这比使用FormHttpMessageConverter更好.
正如@RequestBody的Spring Docs所说,请求体将被转换为您的对象HttpMessageConverter
.
有4个默认的HttpMessageConverters:
要转换url编码的表单,即ajax.serialize()创建,它的作用是FormHttpMessageConverter
.既然你有HttpMediaTypeNotSupportedException
例外,我想你没有配置FormHttpMessageConverter
.检查你的spring配置文件,这是一个例子:
< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
< property name= "messageConverters" >
< list>
< ref bean= "mappingJacksonHttpMessageConverter" />
< ref bean= "stringHttpMessageConverter" />
<!-- Do you have this converter ? -->
< ref bean= "formHttpMessageConverter" />
</ list>
</ property>
</ bean>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
32235 次 |
最近记录: |