web-dev-qa-db-ja.com

Spring 3.1以降@RequestMappingが消費/生産する

@RequestMappingの一部の消費と生成に関して質問があります。 JSONとXMLの両方を受け入れ、JSONが渡されるとJSONを返し、XMLが渡されるとXMLを返したいエンドポイントがあります。この作業を行うために何か特別なことをする必要がありますか?

サンプルコードを以下に示します。

@RequestMapping(value = "/something", method = PUT, 
                consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE}, 
                produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
public SomeObject updateSomeObject(SomeObject acct) {
    return doStuff(acct);
}

これは私が期待している方法で動作しますか、両方のケースを処理するために2つのエンドポイントupdateSomeObjectXMLupdateSomeObjectJsonが必要ですか?

ありがとう、マイク

22
Mike Baglio Jr.

Springブログの記事- Spring MVCを使用したコンテンツネゴシエーション -Spring MVCでコンテンツネゴシエーションがどのように機能するかについての詳細を提供します。同じエンドポイントでXMLとJSONを処理する場合、マッピングは正しい、記事から要約するには:

  1. パス拡張機能を使用する-/something.jsonにjsonを送信し、/something.xmlにxmlを送信し、帰りに同じことを期待できます

  2. Acceptヘッダーを使用し、application/jsonまたはapplication/xmlの値を使用し、Content-Typeを使用して、送信されたメディアタイプを指定します。

20
Biju Kunjummen

簡潔な答え:
@ ResponseBodyでメソッドに注釈を付け、@ RequestBodyでメソッドパラメーターに注釈を付けると、機能します(2つのメソッドは不要です)。

説明
最初に、属性を生成および消費します マッピングタイプを絞り込むに使用されます。デフォルトでは、最初に見つかったHttpMessageConverterが使用され、要求されたメディアタイプに一致します。

次に、クライアントはメディアタイプを要求するでメディアタイプを指定します。
-リクエストヘッダーを受け入れる
-RLサフィックス(http://....//some。xml=> "application/xml"メディアタイプ要求された)
-RL形式パラメーター(.../some?format = xls)

3番目に、produces@ ResponseBodyを組み合わせて、要求されたメディアタイプでオブジェクトを生成します(必要な場合、GET要求に最適です)クライアントに何かを送り返す)、consumes@ RequestBodyを組み合わせて、要求されたメディアタイプ( POSTリクエスト、クライアントから何かを取得する必要がある場合)に最適です。

4、@ ResponseBodyが使用されない場合、HttpMessageConvertersは使用されません。むしろViewResolversはキックインし、ビュー(HTML、PDF ...)を生成し、戻り値の型はViewResolversに付随する規則に従う必要があります(詳細については、デフォルトのビューリゾルバとInternalResourceViewResolverを確認してください) 。

それが役に立てば幸い。

その他のソース:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#consumes-- - http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

11
despot

まあ、

消費/プロデュースString[]をパラメーターとして(Springのドキュメンテーションの RequestMapping を参照)、動作するはずです。 headers = "content-type=application/json,application/xml"

1
freakman