HTTP PUT であるべきだと思うコントローラー アクションがありますが、コントローラー アクションで @RequestParam を使用しようとすると、Spring からエラーが発生します。HTTP PUT メソッドではリクエスト パラメーターが許可されていないため、Spring がそれを拒否しているのでしょうか。
@RequestMapping(value = "/{helpDocumentId}/vote", method = RequestMethod.PUT)
public void voteHelpfulness(@PathVariable long helpDocumentId, @RequestParam boolean isHelpful) {
helpManager.voteOnHelpDocument(helpDocumentId, isHelpful);
}
実行すると、次のエラーがスローされます。
org.springframework.web.bind.MissingServletRequestParameterException: Required boolean parameter 'isHelpful' is not present
もちろん、isHelpful
パラメータは存在します。上記のコードを HTTP POST で完璧に動作させることができるので、これが問題ではないことはわかっています。
$.ajax({
url: "/help/" + helpDocumentId + "/vote.json",
type: "PUT",
data: {
isHelpful: isHelpful
},
success: function(response) {
// ....
}
});
PUT は正しい http メソッドですか? このアクションは を変更しますhelpDocument
が、作成はしません。
ベストアンサー1
以来スプリング3.1、HTTPPutFormコンテンツフィルターデータの取り扱いに使用できますapplication/x-www-form-urlencoded
:
ServletRequest.getParameter*()
HTTP PUT リクエスト中にメソッド ファミリを通じてフォーム エンコードされたデータを利用できるようにするフィルター。サーブレット仕様では、フォーム データは HTTP POST では使用可能ですが、HTTP PUT リクエストでは使用可能ではありません。このフィルターは、コンテンツ タイプが である HTTP PUT リクエストをインターセプトし
'application/x-www-form-urlencoded'
、リクエストの本文からフォームでエンコードされたコンテンツを読み取り、ServletRequest をラップして、HTTP POST リクエストの場合と同様にフォーム データをリクエスト パラメーターとして使用できるようにします。
@RequestBody
JSONなどの他の受信データについては、JQuery、Spring MVC @RequestBody、JSON - 連携させる415 サポートされていないメディア タイプが発生しないようにします。