Printemps @MVC et le @RequestBody annotation avec x-www-form-urlencoded de données?

Je suis à essayer de comprendre pourquoi je ne peux pas obtenir une demande de jQuery.appel ajax, lorsque le Printemps @Controller méthode de gestionnaire comprend un @RequestBody annotation. Considérez les points suivants:

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>

Java:

@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);
}

Ci-dessus échoue avec l' @RequestBody annotation actuelle et de retourner 415 erreur (aucune exception ne sera générée). Mais si le @RequestBody annotation est supprimé (c'est à dire le paramètre de signature est juste FormDataObject formData) ensuite, la méthode sera appelée et JSON sera retourné à l'JavaScript.

Pourquoi est-ce le cas? Un POST demande comprend les données dans le corps de la demande. Ne pas le processus d'annotation d'une telle demande?

Je me rends compte que je pouvais changer le type de contenu envoyé par le JavaScript pour application/json et la consumes propriété MediaType.APPLICATION_JSON_VALUE pour faire de l'annotation fonctionner correctement. Mais pourquoi ne pas travailler avec une forme normale de demande?

Note: je suis à l'aide de Printemps 3.1.4.

OriginalL'auteur James Sumners | 2013-05-08