0

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=

プロジェクトサーブレット.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

何が欠けているのかわからない??どんな助けでも大歓迎です。

4

2 に答える 2

0

クライアントが構文的に正しいエンティティを送信しなかった場合、HTTP 400 Bad Request(クライアントによって送信された要求は構文的に正しくありません) エラーが発生します。

この場合、リクエストの本文は有効な json であることが期待されますが、そうではありませんでした。@Dave が述べたように、リクエストには JSON は含まれていませんが、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 : ...,
    });
});
于 2013-09-16T02:51:38.163 に答える
0

JSONではなくフォームデータとしてシリアル化しています...フォームデータの匿名マップを作成し、それを渡します

于 2013-09-15T11:28:57.860 に答える