2012-10-24 7 views
13

Sto eseguendo un'applicazione Spring 3.1.2. Ho un servlet RESTful con un numero di metodi. I metodi GET funzionano in modo fantastico (corrispondenza @PathVariables, risposte correttamente indirizzate a JSON o XML in base all'intestazione Accept, ecc.) Il 100% delle volte.Spring non accetta un parametro POST a meno che @RequestParam "required = false"

Tuttavia, il metodo POST semplicemente non funziona. Dopo ore passate a fare confusione con i convertiti e ogni altro aspetto di Spring che potevo trovare (tutti i ritocchi ripristinati), l'ho ristretto al campo required in @RequestParam. Si tratta di un metodo di prova semplificato ho usato per indagare:

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

richiesto = false: tutto funziona (parametro viene ricevuto e interpretato). Esattamente come mi aspetto di lavorare

richiesto = true: (o non specificato, dal momento che questo è il default) ho sempre il messaggio "MissingServletRequestParameterException: String Richiesto parametro 'test' non è presente"

Cliente vista laterale:

richiesto = 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 

richiesto = 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 

E 'esattamente la stessa suite di test in esecuzione quando la commutazione required e posso vedere il parametro viene passato. Quando il parametro è opzionale, Spring lo gestisce correttamente.

Se qualcuno lo ha incontrato prima o ha qualche idea mi piacerebbe sentirli. Contrassegnare il parametro richiesto come facoltativo, anche se funziona, è una terribile autodistruzione anche se la commento. Inoltre, il comportamento mi rende un po 'nervoso. Spero di aver rovinato qualcosa da qualche parte ...

risposta

18

L'intestazione Content-Type dovrebbe essere application/x-www-form-urlencoded Penso.

+0

Sei corretto! L'impostazione del 'Content-Type' come suggerito ha in effetti normalizzato il comportamento della mappatura. Non so perché il campo 'required' ha attivato il comportamento divergente quando non sono riuscito a impostarlo, ma è un problema minore. Grazie per il tuo tempo! – node42

Problemi correlati