Jquery序列化& @RequestBody无法正常工作

时间:2013-09-15 11:16:34

标签: jackson

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

我的问题是,无论何时我在下面的控制器方法中使用@RequestBody注释,ajax调用都不会调用此方法但是如果我删除了@RequestBody注释,则控件会出现在方法中,但是联系对象的值为null:为什么序列化表单没有绑定到对象? 并收到错误:客户端发送的请求在语法上不正确

控制器:

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

    return "success";
}

ajax电话:

$("#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个变量存在于我的Contact对象中。

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 jar:jackson-all-1.9.9.jar

不确定我错过了什么?任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

要实现这一目标,请参阅另一个好主题:Convert form data to JavaScript object with jQuery

您的代码的可能修复:

$("#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 : ...,
    });
});