Spring akzeptiert keinen POST-Parameter, es sei denn, @RequestParam "required = false"

Ich führe eine Spring 3.1.2-Anwendung aus. Ich habe ein RESTful-Servlet mit einer Reihe von Methoden. Die GET-Methoden arbeiten fantastisch (@PathVariables Matching, Antworten werden basierend auf dem Accept-Header usw. zu 100% korrekt in JSON oder XML gemarshallt.

Die POST-Methode funktioniert jedoch einfach nicht. Nach stundenlangem Herumspielen mit Konvertiten und allen anderen Frühlingsaspekten, die ich finden konnte (alle Bastelarbeiten rückgängig gemacht), habe ich es auf den Punkt gebrachtrequired Feld in@RequestParam. Dies ist eine vereinfachte Testmethode, mit der ich untersucht habe:

@RequestMapping (value = "/bogus",
                 method = POST)
public @ResponseBody PassResponse bogus (
            @RequestParam (value = "test", required = false) String test) {
    // Just some handy garbage objects that marshal to JSON/XML
    UserResponse user = new UserResponse ();
    user.setName (test);
    AccountDetail detail = new AccountDetail (user,null);
    return new PassResponse (detail);
}

erforderlich = falsch: alles funktioniert (Parameter wird empfangen und interpretiert). Genau so, wie ich es erwartet habe

erforderlich = wahr: (oder nicht angegeben, da dies die Standardeinstellung ist) Ich erhalte ständig die Meldung "MissingServletRequestParameterException: Erforderlicher String-Parameter 'test' ist nicht vorhanden"

Client-Seitenansicht:

erforderlich = wahr

Request URL:http://localhost:8080/internal-project/rest/bogus
Request Method:POST
Status Code:400 Bad Request
Request Headersview source
Accept:application/json
Connection:keep-alive
Content-Length:12
Host:localhost:8080
Request Payload
test=LALALAA
Response Headersview source
Connection:close
Content-Length:971
Content-Type:text/html;charset=utf-8
Date:Wed, 24 Oct 2012 18:41:05 GMT
Server:Apache-Coyote/1.1

erforderlich = falsch

Request URL:http://localhost:8080/internal-project/rest/bogus
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:application/json
Connection:keep-alive
Content-Length:12
Host:localhost:8080
Request Payload
test=LALALAA
Response Headersview source
Content-Type:application/json;charset=UTF-8
Date:Wed, 24 Oct 2012 18:44:03 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

Es ist genau die gleiche Testsuite, die beim Umschalten ausgeführt wirdrequired und ich kann sehen, dass der Parameter übergeben wird. Wenn der Parameter optional ist, behandelt Spring ihn korrekt.

Wenn jemand schon einmal darauf gestoßen ist oder irgendwelche Ideen hat, würde ich sie gerne hören. Das Markieren des erforderlichen Parameters als optional, auch wenn es funktioniert, ist eine schreckliche Selbstdokumentation, auch wenn ich es kommentiere. Außerdem macht mich das Verhalten etwas nervös. Hoffentlich habe ich irgendwo was vermasselt ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage