0

Spring MVC メッセージ コンバーターの使用についていくつか質問があります。

次のような状況がある場合:

私の見解では、次のリンクがあります。

 <a id="writeXmlAccept" class="writeXmlLink" href="<c:url value="/messageconverters/xml" />">Write XML via Accept=application/xml</a>

このリンクは、URL 「/messageconverters/xml」への HTTP リクエストを生成します。

class="writeXmlLink"を持つこのリンクのクリック イベントに関連して、次の Jquery コールバック関数があります。

$("a.writeXmlLink").click(function() {
    /* Variabile che contiene il riferimento all'elemento nel DOM che ha 
       scatenato l'evento click (il link clickato) */
    var link = $(this);     

    // Viene eseguita la chiamata ajax 
    $.ajax({ 
        // Indirizzo verso cui è indirizzata la richiesta 
        url: link.attr("href"),     
        /* Prima di inviare l'HTTP Request esegui la funzione passandogli il
           parametro req che rappresenta l'HTTP Request */
        beforeSend: function(req) { 
            // Se l'url termina con .xml 
            if (!this.url.match(/\.xml$/)) {
              // Aggiunge alla HTTP Request l'header Accept: application/xml 
                req.setRequestHeader("Accept", "application/xml");       
            }

        },
        success: function(xml) {        // Caso di successo: 
            MvcUtil.showSuccessResponse(MvcUtil.xmlencode(xml), link);
        },
        error: function(xhr) {          // Caso di errore: 
            MvcUtil.showErrorResponse(xhr.responseText, link);
        }
    });
    return false;
});

URL 「/messageconverters/xml」は*.xmlパターンで終わっていないため、if本文は実行されAcceptず、このリクエストにはヘッダーが設定されていません

さて、この関数は HTTP リクエストの ajax 呼び出しのみを実行し、応答を待ちます。

この HTTP 要求を処理するコントローラー クラスのメソッドは次のとおりです。

/* Metodo che gestisce HTTP Request di tipo GET dirette verso 
 * l'URL: "/messageconverters/xml" */
@RequestMapping(value="/xml", method=RequestMethod.GET)
public @ResponseBody JavaBean writeXml() {
    return new JavaBean("bar", "apple");
}

このメソッドは、2 つのプロパティを評価する新しい JavaBean オブジェクトを作成して返すだけです。

JavaBean は、getter メソッドと setter メソッド、および toString() メソッドの 2 つのプロパティしか持たない私の例のクラスです。

@XmlRootElement
public class JavaBean {

    @NotNull
    private String foo;

    @NotNull
    private String fruit;

    public JavaBean() {
    }

    public JavaBean(String foo, String fruit) {
        this.foo = foo;
        this.fruit = fruit;
    }
        // GETTER & SETTER & toString()
}

したがって、評価された JavaBean オブジェクトがクライアント (ブラウザー) に返され、ビューに次の出力が表示されます。

<javaBean><foo>bar</foo><fruit>apple</fruit></javaBean>

この例では、コンバーターがいつ、どのように機能するかをよく理解できます。

使用されているコンバーターは、ビュー内に XML コードを記述しているため、および Java クラスと XML フィールド間のマッピングを実装する JAXB アノテーションであるアノテーションをJaxb2RootElementHttpMessageConverter使用して JavaBean クラスにアノテーションが付けられているためだと思います。@XmlRootElement

では、リンクをクリックすると何が起こるのでしょうか?

評価された JavaBean オブジェクトが作成され、それを (HTTP 応答の body フィールド内で) 返すと、この JavaBean オブジェクトは Jaxb2RootElementHttpMessageConverter によって XML ドキュメントに変換されますか?

ありがとう

4

1 に答える 1

1

FireBug などのツールを使用して、正確な要求ヘッダーと応答ヘッダーを確認します。それは物事をより簡単にします。

応答のコンテンツ タイプまたは MIME タイプが正しくないと思われます。つまり、application/xmlまたはである必要がありますtext/xml

コントローラー メソッドで応答コンテンツ タイプを指定する必要があります。これを行うには、コンテンツ タイプの値を注釈のproduces属性に割り当てるだけです。@RequestMapping

たとえば、春のドキュメントhttp://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.htmlで利用できます

お役に立てれば。

于 2013-04-19T12:56:43.197 に答える