Spring@MVC和带有x-www-form-urlencoded数据的@RequestBody注释?
我试图弄清楚为什么当SpringSpring@MVC和带有x-www-form-urlencoded数据的@RequestBody注释?,spring,jquery,spring-mvc,Spring,Jquery,Spring Mvc,我试图弄清楚为什么当Spring@Controller处理程序方法包含一个@RequestBody注释时,我无法从jQuery.ajax调用接收请求。考虑以下事项: @RequestMapping( value = "/baz", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = Mediat
@Controller
处理程序方法包含一个@RequestBody
注释时,我无法从jQuery.ajax调用接收请求。考虑以下事项:
@RequestMapping(
value = "/baz",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
FormDataObject formData)
{
return this.searchService.find(formData);
}
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\u json\u VALUE
,以使注释正常工作。但是为什么它不能与普通表单请求一起工作呢
注意:我正在使用Spring 3.1.4。您是否尝试打开“org.springframework.web”上的登录以查找返回状态代码的原因?在转换为415之前,应该引发并记录异常 如果发送表单数据,为什么不省略@RequestBody呢。然后将使用数据绑定(即@modeldattribute),将Servlet请求参数应用于对象字段。这比使用FormHttpMessageConverter更可取。如所述,请求主体将通过
HttpMessageConverter
转换为您的对象
有4个默认的HttpMessageConverters:
- :转换字节数组
- :转换字符串
- :将表单数据转换为多值映射或从多值映射转换表单数据李>
- :转换 发送到javax.xml.transform.Source或从javax.xml.transform.Source发送
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>
问题在于,当我们使用应用程序/x-www-form-urlencoded时,Spring并不将其理解为请求主体。所以,如果我们想用这个
我们必须删除@RequestBody注释
然后尝试以下操作:
@RequestMapping(
value = "/baz",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
FormDataObject formData)
{
return this.searchService.find(formData);
}
请注意,已删除注释@RequestBody
回答:打开日志显示,使用
@RequestBody
注释,它确实映射到了正确的方法,但它抛出了“org.springframework.web.HttpMediaTypeNotSupportedException:Content type'application/x-www-form-urlencoded;charset=UTF-8'notsupported”,注释@RequestBody
意味着要处理的数据将在请求的主体中。这将通知编译器和读取代码的人员。因此,离开它会导致代码模棱两可。这就是为什么我想知道为什么失败的原因。即使我添加了所有转换器,上述方法对我也不起作用。我不得不使用定制的转换器来制作它work@usr-局部-ΕψΕ∧ΝΝ您的问题与此问题相同吗?我的答案是关于这个问题,如果你的答案不同,或者你应该问一个新问题来解释更多细节。不同的问题是:我在提交表单时出错406,在提交JSON时成功。然而,在使用Spring中的代码进行调试之前,我不知道请求实体必须以某种方式实现多值映射
,才能使用FormHttpMessageConverter
。因此,现在我开始认为,要么是OP的FormDataObject
实现了该接口,要么就是我遇到了与OP相同的问题,但添加该转换器不起作用。顺便说一下,我用的是Spring4。2@usr-本地-ΕψΕΕ∧Ν我建议您针对您的问题提出一个新问题,在此评论中,没有提供足够的信息。@SidneydeMoraes,应该是这样。但您可以自己将多值映射转换为对象。