¿Es posible que los valores de RequestParam vacíos utilicen el valor predeterminado?


120

si tengo un mapeo de solicitud similar al siguiente:

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

Y luego llame a esta solicitud con:

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

Me sale el mensaje de error

Error al convertir el valor del tipo 'java.lang.String' al tipo 'int'; la excepción anidada es java.lang.NumberFormatException: para la cadena de entrada: "" '

Puedo resolver esto impidiendo que el cliente javascript envíe parámetros vacíos o aceptando valores de cadena y solo analizando si no se encuentran en blanco.

ACTUALIZACIÓN : Las versiones posteriores de Spring ahora implementan el comportamiento originalmente deseado.

Acabo de probar esto en la primavera 4.3.5 y descubrí que el comportamiento ahora, de hecho, convertirá el valor nulo en el valor predeterminado sin generar un NumberFormatException, por lo tanto; mi mapeo original ahora funciona bien.

No estoy seguro de qué versión de primavera se realizó este cambio de comportamiento.


seguramente el parámetro sería un tipo Integer para generar esa excepción?
laher

3
No soy un experto en primavera, pero ¿se usa el valor predeterminado cuando no lo configura? es decir, si su solicitud será example.com/test ? cuando usa example.com/test?i=, entonces i está presente y configurado en "", por lo que no se usa el valor predeterminado
user902383

Gracias amir75, Stringtipo suministrado accidentalmente . user902383, eso es correcto, aunque para un valor entero preferiría que un valor nulo / vacío use el valor predeterminado en su lugar.
Brett Ryan

Respuestas:


175

Puede cambiar el tipo @RequestParam a un Integer y hacer que no sea necesario. Esto permitiría que su solicitud se realizara correctamente, pero luego sería nula. Puede establecerlo explícitamente en su valor predeterminado en el método del controlador:

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

He eliminado el valor predeterminado del ejemplo anterior, pero es posible que desee incluirlo si espera recibir solicitudes donde no está configurado en absoluto:

http://example.com/test

6
Solo una actualización de esto, las versiones recientes de spring en realidad ya no requieren la verificación nula, ya que el comportamiento deseado se ha incluido con spring de que los valores vacíos darán como resultado el uso del valor predeterminado.
Brett Ryan

3
Respuestas obsoletas, la mejor solución es de @AppLend
Jose Pose S

101

Puede mantener el tipo primitivo estableciendo el valor predeterminado, en su caso, simplemente agregue la propiedad "required = false" :

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

PD: esta página de la documentación de Spring puede ser útil: Tipo de anotación RequestParam


1
Gracias, pero no entendiste el punto de mi pregunta que está en el título. He solicitado la capacidad de proporcionar parámetros vacíos /test?i=y, dado que iestá vacío, tiene el valor predeterminado.
Brett Ryan

5
De todos modos, cuando defaultValuese proporcionó, required == falseimplícitamente
Timur Milovanov

4
Si se proporciona el parámetro pero está vacío defaultValue, no surte efecto.
Brett Ryan

12

Puede configurar RequestParam, usando la clase genérica Integer en lugar de int, resolverá su problema.

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

1

También puedes hacer algo como esto:

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

3
Si tiene un valor predeterminado, no es necesario que lo convierta en opcional.
Kevin M

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.