10

@ControllerSpringハンドラー メソッドに@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/jsonconsumesプロパティを変更MediaType.APPLICATION_JSON_VALUEして、注釈を正しく機能させることができることを認識しています。しかし、通常のフォーム リクエストではなぜ機能しないのでしょうか。

:Spring 3.1.4を使用しています。

4

3 に答える 3

7

「org.springframework.web」のログを上げて、返されたステータス コードの理由を調べてみましたか? 415 に変換される前に、例外が発生してログに記録されるはずです。

また、フォーム データを送信する場合は、@RequestBody を省略しないでください。次に、サーブレット リクエスト パラメータをオブジェクト フィールドに適用するデータ バインディング (@ModelAttribute) を使用します。これは、FormHttpMessageConverter を使用するよりも望ましい方法です。

于 2013-05-09T21:38:09.737 に答える
6

@RequestBodyのSpring Docs にあるように、リクエスト本文は によってオブジェクトに変換されますHttpMessageConverter

デフォルトの HttpMessageConverters は 4 つあります。

ajax.serialize() create である URL エンコード形式を変換するのは、FormHttpMessageConverter. 例外があるのでHttpMediaTypeNotSupportedException、構成しなかったと思いますFormHttpMessageConverter。春の構成ファイルを確認してください。例を次に示します。

< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
   < property name= "messageConverters" >
         < list>
             < ref bean= "mappingJacksonHttpMessageConverter" />
             < ref bean= "stringHttpMessageConverter" /> 
             <!-- Do you have this converter ? -->
             < ref bean= "formHttpMessageConverter" />
         </ list>
    </ property>
</ bean>
于 2015-03-01T10:32:03.427 に答える
-3

問題は、application/x-www-form-urlencodedを使用すると、Spring がそれを RequestBody として認識しないことです。したがって、これを使用する場合は、@RequestBodyアノテーションを削除する必要があります。

次に、次のことを試してください。

@RequestMapping(
        value = "/baz",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
        produces = MediatType.APPLICATION_JSON_VALUE
)
public @ResponseBody SearchResults[] jqueryPostHandler(
        FormDataObject formData)
{
    return this.searchService.find(formData);
}

注釈@RequestBodyを削除したことに注意してください

answer :コンテンツ タイプが application/x-www-form-urlencoded の Http Post リクエストが Spring で機能しない

于 2016-07-07T18:40:56.610 に答える