2012-04-17 15 views
0

例をKramsからフォローする。以下のものが返されますが、Personオブジェクトは、送信されたリクエストのヘッダに基づいてJSONまたはXMLに変換されますか?Spring MVC repsonsebody

@RequestMapping(value = "/person", 
      method = RequestMethod.POST, 
      headers="Accept=application/xml, application/json") 
public @ResponseBody Person addPerson(@RequestBody Person person) { 
    logger.debug("Provider has received request to add new person"); 

    // Call service to here 
    return personService.add(person); 
    } 

データをjsonとして送信すると、私はjsonを返し、xmlも同じ結果になります。それとも別のことが起こっていますか?

答えて

2

Accept httpリクエストヘッダーに依存します。それがjsonなら、あなたはjsonを取得します。xmlならxmlを取得します。あなたのコードのこの部分が言うまさにそれだ

.... 
headers="Accept=application/xml, application/json") 
... 

あなたは1つのMIMEタイプを送信し、問題なく別のものを受け取ることができます。

編集

両方headersproduces/consumesパラメータのみ requestmappingによって消費/製造することができるものを言います。彼らは特定のシリアル化を強制しません。要求/応答のタイプは、要求ヘッダーで完全に決定されます。ディスパッチャが要求ヘッダーに一致するproducesconsumes(またはヘッダー)のマッピングを見つけられなかった場合、エラーが発生します。

+0

produceとconsumesパラメータを使用して、XMLを消費し、jsonを生成することを指定できます(スマートな考えではないかもしれませんが)。 – NimChimpsky

+0

@NimChimpskyはい、これがアイデアです。 – soulcheck

+0

@NimChimpsky 'produced'と' consumes'はspring mvc 3.1の新しいパラメータです。これらは、コンテンツタイプマッチングに使用されたときに 'headers'パラメータを置き換えます。だからあなたがspring 3.1を使うなら、 'produce'と' consumes'を使うべきです。 – soulcheck

0

@RequestMappingへの 'ヘッダー'、 'プロデュース'、および '消費'パラメータはパズルの1つです。それらは、フレームワークが着信要求をルーティングするのを助け、ヘッダーの値に基づいて要求を区別します。

このパズルのもう1つの部分は、アプリケーションで設定されているMessageConvertersのセットです。この例のコントローラハンドラメソッドはオブジェクトを返すだけであり、フレームワークはオブジェクトをテキスト表現(XMLまたはJSON)に変換する方法を知る必要があります。 MessageConvertersはインバウンド側(@RequestBodyでアノテーションされたパラメータ)とアウトバウンド側(メソッドの戻り値に@ResponseBodyで注釈が付けられている場合)に使用されます。適切なMessageConverterは、着信要求のメディアタイプに基づいてフレームワークによって選択されます。

mvc:annotation-driven >名前空間をSpring XML設定ファイルに使用する場合、またはJava Configクラスで@EnableMvcアノテーションを使用する場合は、JSONとXMLをサポートするMessageConvertersが自動的に設定されます。