2012-02-02 3 views
5

私は、Spring 3.1.0.RELEASEを使用してSpring Restサービスを提供しています。ここで問題となっているサービスコールに関連するコードは次のとおりです。Springサービスがクライアントから要求されたコンテンツタイプを返すのはなぜですか?

@RequestMapping(value="/{var1}", method=RequestMethod.GET, produces="application/json") 
@ResponseBody 
public String getSomeStuff(@PathVariable final String var1) { 
    return myJsonString; 
} 

私は、次のcurlコマンドを使用して、これを呼び出した場合、私が期待する一方で、それは喜んでくれたアプリケーション/ XMLのコンテンツタイプと私のJSON文字列を返します。春3.1のドキュメントに基づいて406:このサービス(シリアライズ)のための私のアプリで余分な設定はありません

curl -v -H "Accept: application/xml" http://localhost:8080/MyServiceSite/myvalue 

、私は、設定されたサービスのための無後処理で生のJSONを返すいます。私は何かを見逃していると確信しています、誰かが私が逃したかもしれない何かを指摘できますか?

編集:ここがdocumentationです。これを試してみると、私は見ていました。特にセクション16.3.2.5。私のコードは、Springがシリアライゼーションを処理できるようにするための設定を前提にしているように見えることを除いて、非常に似ています。おそらく、Springのシリアル化をバイパスしても、プロダクションが動作しないでしょうか?

編集:応答コードの期待値を変更しました。 415は私のリクエストボディに不適切なコンテンツを送っていたことを示していますが、406はサーバーのコンテンツタイプに気づかない受け入れヘッダを持つのに適しています。

とにかく、このメソッドを変更してMapを返し、jsonにシリアル化するための設定を追加しました。そして、クライアントから無効なコンテンツタイプを送信すると、適切な406応答を取得します。メソッドの出力がシリアル化されていないときは、「生成」設定が無視されるようです。

+0

おそらく、あなたは自分の質問に変更されたコードと適用可能な設定で答えて、将来見ている人に利益をもたらすことができます。 – digitaljoel

+0

シリアライズを有効にすることなくそれを行う方法を見つけられない場合は、私はそれを行います。私が持っているデータは既にシリアル化されているため、シリアル化を解除して適切な動作をさせるために再直列化しなければならない場合は残念です。だから私はまだこれを稼働させる他の方法を探しています。 – mockobject

答えて

1

生成条件はSpring MVC 3.1で新しく、RequestMappingHandlerMappingおよび関連する@MVCサポートクラス(new in Spring 3.1)でのみサポートされています。私の推測では、生成条件をサポートしていない3.0 @ MVCサポートクラスを使用しているということです。そうでなければあなたのコードは正しいので、何が起こるべきかについてのあなたの期待があります。

3.1では、headers = "Accept = application/json"の使用は不要です。それは正確に生産条件が導入されたものです。

+0

私は春3を使用しています。1と私の依存関係を確認していたが、これは私のconfig内の何かが古いハンドラを使用するように設定されているかどうか、あなたがこれを述べたときに私は思った。確かに、を使用しているのは古いハンドラを使用しているのに対し、は新しいハンドラを使用しているように見え、すべて正常に動作します。なんらかの理由で、この事実は私がドキュメンテーションを読んでいると私には分かりませんでした。 – mockobject

1

@RequestMappingheaders属性についてはどうでしょうか。そこにAcceptヘッダーを設定することができます。私は春が一致するヘッダのないそのパスへのリクエストを処理する方法を知りません

@RequestMapping(value="/{var1}", method=RequestMethod.GET, produces="application/json", headers = "Accept=application/json") 
@ResponseBody 
public String getSomeStuff(@PathVariable final String var1) { 
    return myJsonString; 
} 

:ような何か。それがあなたの望むものを与えていない場合は、ヘッダーなしで同様のマッピングを定義し、ResponseEntityを返信して応答コードなどを設定する必要があるかもしれませんが、適切に処理することを願っています。

+0

残念ながら、ヘッダーの設定があまりにも表示されます。その小さな問題は、406の代わりに404を返すことです。大きな問題は、何らかの理由で明示的に以外に解決しないということです。たとえば、クライアントがaccept */*を送信すると、エラーになります。これは、クライアントがapplication/jsonを受け入れる場合にのみ解決されます。おそらく私たちにとっても大丈夫ですが、それは間違っているようです。 – mockobject

+0

それは残念です。 – digitaljoel

関連する問題