2010-11-26 6 views
2

私はSpringのMVCデータバインディング機能に関する小さな質問があります。フォームデータとXMLリクエストボディの両方を受け入れるためにSpringでエンドポイントを設定するには?


@Controller 
@RequestMapping("/foo") 
public class FooController() { 

    // … some init stuff // 

@RequestMapping(value = "/{id}/edit.{format}", method = RequestMethod.POST) 
    public ModelAndView editFoo(@RequestBody FooItem foo, @PathVariable("format") String format) { 

     // some code here to edit the FooItem // 
    } 
} 

私は、フォームデータだけでなく、このメソッドに対するXMLを投稿できるようにしたい: は、私は、次のコントローラクラスを持っています。そのために私はapplicationContext.xmlに2つのメッセージコンバータを追加しました:デフォルトのformHttpMessageConverterとXStreamマーシャラー。

これはうまくいきますが、私は@RequestBodyを使用してURLに対するフォームデータを送信すると、サーバーが415エラーで応答するという問題があります。この注釈を削除すると、フォームデータはうまく機能し、Springはオブジェクトを作成しますが、XMLを投稿すると空のオブジェクトが生成されます。

これを回避する方法はありますか、または両方の受信フォーマットを処理するには2つの方法が必要ですか?

ありがとうございます!

+0

どのようにフォームデータを投稿しますか?要求に 'Content-Type:application/x-www-form-urlencoded'ヘッダがあることを確認してください。 – axtavt

+0

のデータは標準のHTMLフォームでポストされているので、 Content-Typeヘッダーは、 "Application/x-www-form-urlencoded" – Markus

答えて

2

私はあなたには2つの方法が必要だと思います。 @ModelAttributeが提供するよう

FormHttpMessageConverterが同じデータバインディング機能を持っていない、それは(javadocを参照)のみMultiValueMapに、指定されたターゲットクラスに要求をバインドすることはできません。

+0

という音が妥当であることを示しています。FormHttpMessageConverterはMultiValueMapを返します。 – Markus

+0

この解決策は機能しますが、余分なエンドポイント(XMLでは '/ foo'、フォームデータでは'/foo/bar')が必要です。リクエスト構造のフィルタがリクエストを分離し、単一のエンドポイント(ボディやボディではない)を公開するのに役立つことがわかりましたが、もっと簡単なアプローチがあるかどうかは疑問です。そしてはい、これは古い投稿です。レガシーコードの作業〜 –

関連する問題