È possibile che i valori RequestParam vuoti utilizzino il defaultValue?


120

se ho una mappatura della richiesta simile alla seguente:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

E poi chiama questa richiesta con:

http://example.com/test?i=

Ottengo il messaggio di errore

Impossibile convertire il valore di tipo "java.lang.String" nel tipo "int"; l'eccezione annidata è java.lang.NumberFormatException: per la stringa di input: "" '

Posso risolvere questo problema impedendo al client javascript di inviare parametri vuoti o accettando valori stringa e analizzando solo se non vengono trovati vuoti.

AGGIORNARE : Le versioni successive della primavera ora implementano il comportamento originariamente desiderato.

L'ho appena testato nella primavera 4.3.5 e ho scoperto che il comportamento ora trasformerà il valore nullo nel valore predefinito senza aumentare un NumberFormatException , quindi; la mia mappatura originale ora funziona bene.

Non sono sicuro di quale versione della primavera sia stato apportato questo cambiamento comportamentale.


sicuramente il parametro sarebbe un tipo Integer per sollevare tale eccezione?
laher

3
Non sono esperto di primavera, ma viene utilizzato il valore predefinito quando non lo si imposta? cioè se la tua richiesta sarà example.com/test ? mentre utilizzi example.com/test?i=, i è presente e impostato su "", quindi il valore predefinito non viene utilizzato
user902383

Grazie amir75, Stringtipo fornito accidentalmente . user902383, è corretto, anche se per un valore intero preferirei che un valore null / vuoto usasse invece il valore predefinito.
Brett Ryan

Risposte:


175

È possibile modificare il tipo @RequestParam in un numero intero e renderlo non richiesto. Ciò consentirebbe la riuscita della tua richiesta, ma sarebbe quindi nullo. È possibile impostarlo esplicitamente sul valore predefinito nel metodo del controller:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

Ho rimosso defaultValue dall'esempio sopra, ma potresti volerlo includere se prevedi di ricevere richieste in cui non è impostato affatto:

http://example.com/test

6
Solo un aggiornamento su questo, le versioni recenti di spring in realtà non richiedono più il controllo null poiché il comportamento desiderato è stato incluso con spring che i valori vuoti risulteranno nell'uso del valore predefinito.
Brett Ryan

3
Risposte obsolete, la soluzione migliore è da @AppLend
Jose Pose S

101

Puoi mantenere il tipo primitivo impostando il valore predefinito, nel tuo caso aggiungi semplicemente la proprietà "required = false" :

@RequestParam(value = "i", required = false, defaultValue = "10") int i

PS Questa pagina dalla documentazione di Spring potrebbe essere utile: Annotation Type RequestParam


1
Grazie ma hai perso il punto della mia domanda che è nel titolo. Ho chiesto la possibilità di fornire parametri vuoti /test?i=e poiché iè vuoto hanno il valore predefinito.
Brett Ryan

5
In ogni caso, quando è defaultValuestato fornito, required == falseimplicitamente
Timur Milovanov

4
Se il parametro è fornito ma è vuoto defaultValuenon ha effetto.
Brett Ryan,

12

Puoi impostare RequestParam, usando la classe generica Integer invece di int, risolverà il tuo problema.

   @RequestParam(value= "i", defaultValue = "20") Integer i

1

Puoi anche fare qualcosa del genere:

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i

3
Se si dispone di un valore predefinito, non è necessario impostarlo come facoltativo.
Kevin M

1

Questo è stato considerato un bug nel 2013: https://jira.spring.io/browse/SPR-10180

ed è stato risolto con la versione 3.2.2. Il problema non dovrebbe verificarsi in nessuna versione successiva e il codice dovrebbe funzionare perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.