2012-10-24 16 views
13

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 ...

Odpowiedz

18

Twój nagłówek powinien być Content-Typeapplication/x-www-form-urlencoded.

+0

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

Powiązane problemy