Używam aplikacji Spring 3.1.2. Mam serwletu RESTful z wieloma metodami. Metody GET działają fantastycznie (dopasowywanie @PathVariables
, odpowiedzi poprawnie kierowane do JSON lub XML na podstawie nagłówka Accept itd.) W 100% przypadków.Sprężyna nie akceptuje parametru POST, chyba że @RequestParam "required = false"
Jednak metoda POST po prostu nie działa. Po godzinach błądzenia z konwertorami i każdym innym wiosennym aspektem, jaki mogłem znaleźć (wszystkie majstrowanie zostało odwrócone), zawęziłem je do pola required
w @RequestParam
. Jest to uproszczona metoda badawcza Używam do zbadania:
@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);
}
wymagane = false: wszystko działa (jest odbierane i interpretowane parametr). Dokładnie tak, jak można oczekiwać, że do pracy
wymagane = true (lub nie określony, ponieważ jest to ustawienie domyślne) Ja konsekwentnie się komunikat „MissingServletRequestParameterException: Wymagane String parametr«test»nie występuje”
Client widok z boku:
wymagane = true
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
wymagane = false
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
Jest to dokładnie ten sam zestaw testowy jest prowadzony podczas przełączania required
i widzę parametr jest przekazywana. Gdy parametr jest opcjonalny, Spring obsługuje go poprawnie.
Jeśli ktokolwiek przeszedł przez to wcześniej lub ma jakieś pomysły, chciałbym je usłyszeć. Oznaczenie wymaganego parametru jako opcjonalnego, nawet jeśli działa, jest okropną dokumentacją samego siebie, nawet jeśli ją skomentuję. Dodatkowo zachowanie mnie trochę denerwuje. Mam nadzieję, że po prostu coś dokręciłem ...
Masz rację! Ustawienie "Content-Type" zgodnie z sugestią faktycznie znormalizowało zachowanie mapowania. Nie wiem, dlaczego pole "wymagane" wyzwoliło rozbieżne zachowanie, gdy nie udało mi się tego ustawić, ale to jest mniejsza sprawa. Dziękuję za Twój czas! – node42