0

この期間、私はSpringMVCショーケースの例を研究しています。

リクエストのマッピングについて、少し疑問があります。次のような状況があります。

フォームを送信するビューで、このフォームを送信すると、次のJquery関数が開始されます。

$("form.readJsonForm").submit(function() {          

    var form = $(this);                 // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento submit (il form) 
    var button = form.children(":first");       // Seleziona il bottone submit 

    var data = form.hasClass("invalid") ?       // OPERATORE CONDIZIONALE: il form ha classe "invalid" ? 
            "{ \"foo\": \"bar\" }" :            // SI: foo = bar 
            "{ \"foo\": \"bar\", \"fruit\": \"apple\" }";   // NO: foo= bar ; fruit = apple 


    /* AJAX CALL PARAMETER:
       type: Say to the servlet tath the request is a POST HTTP Request
       url: The address to which to send the call   
       data: the content of my data variable
       contentType: an object having JSON format
       dataType: the type of content returned by the server
    */
    $.ajax({ type: "POST", url: form.attr("action"), data: data, contentType: "application/json", dataType: "text", 
        success: function(text) { MvcUtil.showSuccessResponse(text, button); }, 
        error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});

    return false;
});

したがって、私の場合、JSON形式の次のJavaScriptオブジェクトが生成されます。

{\ "foo \":\ "bar \"、\ "fruit \":\ "apple \"}

では、Jquery関数がAJAX呼び出しを実行し、JSONオブジェクトをSpringコントローラークラスに送信します。

これは、このHTTPリクエストを処理するメソッドです。

@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
    System.out.println("foo: " + javaBean.getFoo() + " fruit: " + javaBean.getFruit());
    return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}

このメソッドは、次のURLに対するHTTP POSTリクエストを処理します: "/ mapping / contains"そしてJSONオブジェクトを消費します(これはconsumes = MediaType.APPLICATION_JSON_VALUEで指定されます)

このメソッドは、@ RequestBodyアノテーションを使用してアノテーションが付けられた入力パラメーターを受け取ります。これは、メソッドパラメーターがHTTPリクエストの本文(JSONオブジェクト)の値にバインドされる必要があることを示します。

JavaBeanクラスには、次の2つのプロパティのみが含まれます。

private String foo;
    private String fruit;

(JSONオブジェクトのプロパティとして)

JSONオブジェクトのプロパティをJavaBeanプロパティにバインドするために、JavaBeanクラスには@XmlRootElementアノテーションが付けられています。

パッケージorg.springframework.samples.mvc.mapping;

インポートjavax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class JavaBean {

private String foo = "bar";
    private String fruit = "apple";

    // Setter and Getter method for properties

これで、Springコントローラーのオブジェクトに@RequestBodyアノテーションが表示され、@RequestMappingアノテーションのconsumes属性が"application / xml"であることがわかりました(またはSpring3.1より前のContent-Typeヘッダーは"application / xml ")これにより、リクエストメッセージのペイロードがXMLであり、@RequestBodyでアノテーションが付けられたオブジェクトにマーシャリングを解除する必要があることがSpringに通知されます。この場合、@ RequestBodyでアノテーションが付けられたオブジェクトは、通常、そのオブジェクトをXMLとの間でマーシャリングおよびアンマーシャリングするために必要なメタデータを提供するために、JAXbアノテーションで自身にアノテーションが付けられます。@ XmlRootElementは、そのメタデータを提供するアノテーションの1つです。

わかりました、これはすべて私には明らかです...私の唯一の疑問は、@ RequestMappingアノテーションで、Content-Typeヘッダーが"application / xmlに設定されているのではなく、 consumes=MediaType.APPLICATION_JSON_VALUEであるという事実に関連しています。

だから私はあなたに次の質問があります:

1) Content-Typeヘッダーconsumes=MediaType.APPLICATION_JSON_VALUEの違いは何ですか

2)** @ XmlRootElement **のドキュメントを読んで理解していることから:http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html

このアノテーションは、XMLコンテンツとコンテンツJAVA間の双方向の関連付けを提供します。したがって、JavaクラスプロパティのXMLフィールドのコンテンツをマップでき、逆に

問題は、この場合、私はXML「オブジェクト」を持っていませんが、XMLの代わりとなるJSONオブジェクトを使用していることです!!! 私は何が欠けていますか?

どうもありがとうございます

アンドレア

4

1 に答える 1

1

最初にあなたの質問に答えます:

Content-Type ヘッダーと consumers=MediaType.APPLICATION_JSON_VALUE の違いは何ですか?

どちらもコンテンツ タイプを定義しますが、異なる目的で使用されます。

  • Content-Type ヘッダーは HTML 仕様の一部です。これは、HTML メッセージのヘッダーの一部として送信されるプロパティであり、送信されるデータ ペイロードの形式を受信者に伝えます。
  • Spring コントローラーで使用される「consumes」アノテーションは、コントローラーが受け入れるコンテンツ タイプを制限するメカニズムを提供します。コントローラーを に設定するconsumes=MediaType.APPLICATION_JSON_VALUEことで、JSON 形式のペイロードをコントローラーに送信することを指定した発信者からのメッセージのみを受け入れるようコントローラーに指示します。これは、クライアント コードで「application/json」のコンテンツ タイプが指定されていることを確認する必要があることを意味しますが、サンプル コードに基づいて、適切に設定されているように見えます。(消費アノテーションは、メソッドを「制限」するのではなく、メソッドのコンテンツタイプと一致することに注意してください。ただし、質問の目的のために、私は物事を単純化しています。詳細については、このリンクを参照してください。

そして、2番目の質問/問題に関して:

あなたのコードは、Spring 3.0+ を使用して JSON メッセージを関連付けられた Java オブジェクトにマーシャリングするための正しい軌道に乗っているように見えますが、Spring 構成が適切に設定されていることを確認する必要がある場合があります。<mvc:annotation-driven/>Spring MVC での JSON および/または XML マーシャリング/アンマーシャリングに必要な Jackson サポートを含むセットが Spring 構成に含まれていることを確認してください (つまり、Jackson がクラスパス上にあることを確認します)。詳しくはこちらをご覧ください。

また、@XmlRootElementタグは XML マーシャリング/アンマーシャリングに使用され、JSON を使用して通信する場合は必要ないため、削除します。(単に無視する必要がありますが、本当に必要ない場合は削除します)。

最後に、質問または実際のコードで説明目的でクラス名「JavaBean」を使用していたかどうかはわかりませんが、コードでそれを使用している場合は、名前を変更することをお勧めします。「JavaBean」という用語は Java の複数の場所ですでに使用されており、同じ名前のクラスがあると混乱する可能性があります。

于 2012-12-10T14:25:25.463 に答える