Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring@MVC和带有x-www-form-urlencoded数据的@RequestBody注释?_Spring_Jquery_Spring Mvc - Fatal编程技术网

Spring@MVC和带有x-www-form-urlencoded数据的@RequestBody注释?

Spring@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

我试图弄清楚为什么当Spring
@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发送
要转换url编码的表单,即ajax.serialize()create,这是
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,应该是这样。但您可以自己将多值映射转换为对象。