0

好吧,我已经在 SO 中解决了有关此主题的大部分问题,但无法解决此问题。

我的问题是,每当我在下面的控制器方法中使用 @RequestBody 注释时,ajax 调用永远不会调用此方法,但是如果我删除 @RequestBody 注释,则控件会出现在方法中,但联系人对象的值为空:Why the serialized form没有绑定到对象?并收到错误:客户端发送的请求在语法上不正确

控制器:

@RequestMapping(value="/addContacts.htm", method = RequestMethod.POST, headers = {"content-type=application/json"})
@ResponseBody
public String addContacts(@RequestBody Contact contact, HttpServletRequest request ) {

    return "success";
}

阿贾克斯调用:

$("#add_more_contact").click(function(){
    var formJson = $("#addContactForm").serialize();
    $.ajax( {
        url : "/myproject/admin/addContacts.htm",
        type : "POST",
        data : formJson, 
        dataType : "text",
        contentType : "application/json",
        success : function(data) {
            alert('Success - '+data);
        },
        error : function(xhr, desc, err) {
            alert("Desc: " + desc + "\nErr:" + err);
        }
    });
});

ajax 请求中的 POST 数据:这 4 个变量存在于我的联系人对象中。

firstName=bill&lastName=gates&email=&mobileNumber=

项目-servlet.xml:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json"/> 
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter" />
        </list>
    </property>
</bean>
<mvc:annotation-driven/>

使用杰克逊罐:jackson-all-1.9.9.jar

不知道我错过了什么?任何帮助将不胜感激。

4

2 回答 2

0

您正在序列化为表单数据而不是 json ...构建表单数据的匿名映射并传递它

于 2013-09-15T11:28:57.860 回答
0

HTTP 400 Bad Request客户端未发送语法正确的实体时,会发生(客户端发送的请求语法不正确)错误。

在这种情况下,请求正文应该是有效的 json,但事实并非如此。正如@Dave 提到的,您的请求不包含 JSON,而是包含 urlencoded 字符串,例如name=stack&value=overflow. 相反,它应该是 JSON,例如{"name":"stack", "value":"overflow"}.

要实现这一点,请参考另一个好的线程:使用 jQuery 将表单数据转换为 JavaScript 对象

您的代码的可能修复:

$("#add_more_contact").click(function(){
    var formJson = $("#addContactForm").serializeToObject(); // use plugin, or build by yourself
    // this variable should be a javascript object, 
    // such as {"name":"stack", "value":"overflow"}

    $.ajax( {
        url : "/myproject/admin/addContacts.htm",
        type : "POST",
        data : JSON.stringify(formJson),  // serialize javascript object to JSON 'string'
        dataType : "json",  // 'text' -> 'json'
        contentType : "application/json", // this can be omitted
        success : ...,
        error : ...,
    });
});
于 2013-09-16T02:51:38.163 回答