@Controller
Springハンドラー メソッドに@RequestBody
アノテーションが含まれているときに、jQuery.ajax 呼び出しからリクエストを受信できない理由を理解しようとしています。次の点を考慮してください。
HTML/JavaScript :
<form id="foo" action="/baz">
<input name="bar">
</form>
<script>
$(function() {
var $fooForm = $('#foo');
$fooForm.on('submit', function(evt) {
evt.preventDefault();
$.ajax({
url: $fooForm.action,
data: $fooForm.serialize(),
dataType: 'json',
type: 'POST',
success: function(data) { console.log(data); }
});
});
});
</script>
ジャワ:
@RequestMapping(
value = "/baz",
method = RequestMethod.POST,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
@RequestBody FormDataObject formData)
{
return this.searchService.find(formData);
}
上記は@RequestBody
注釈が存在する場合に失敗し、415 エラーを返します (例外は生成されません)。ただし、@RequestBody
注釈が削除された場合 (つまり、パラメーターの署名がFormDataObject formData
.
これはなぜですか?POST
リクエストには、リクエストの本文にデータが含まれます。アノテーションはそのようなリクエストを処理すべきではないでしょうか?
JavaScript によって送信されるコンテンツ タイプapplication/json
とconsumes
プロパティを変更MediaType.APPLICATION_JSON_VALUE
して、注釈を正しく機能させることができることを認識しています。しかし、通常のフォーム リクエストではなぜ機能しないのでしょうか。
注:Spring 3.1.4を使用しています。