2012-09-06 14 views
65

si tengo aa mapeo petición similar a la siguiente:¿Es posible tener valores de RequestParam vacíos usando el valor predeterminado?

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

y luego llamar a esta petición con:

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

me sale el mensaje de error

Error al convertir el valor de escriba 'java.lang.String' para escribir 'int'; la excepción jerarquizada es java.lang.NumberFormatException: Para cadena de entrada: ""'

puedo solucionar esto ya sea deteniendo el cliente JavaScript desde el envío de parámetros vacíos, o mediante la aceptación de los valores de cadena y sólo analizar si ellos no se encuentran estar en blanco

ACTUALIZACIÓN: Las versiones posteriores del resorte ahora implementan el comportamiento originalmente deseado.

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

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

+0

¿De seguro el parámetro sería un tipo de Entero para levantar esa excepción? – laher

+3

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

+0

Gracias amir75, tipo 'String' proporcionado accidentalmente. user902383, eso es correcto, aunque para un valor entero, preferiría que un valor nulo/vacío usara el valor predeterminado en su lugar. –

Respuesta

101

Puede cambiar el tipo @RequestParam a un Entero y hacer que no sea necesario. Esto permitiría que su solicitud tenga éxito, pero luego sería nula. También podemos establecer de manera explícita a su valor por defecto en el método controlador:

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

He quitado la defaultValue en el ejemplo anterior, pero es posible que desee incluirlo si va a recibir las solicitudes en las que no se establece en absoluto:

http://example.com/test 
+3

Solo una actualización sobre esto, las versiones recientes de la primavera en realidad ya no requieren la verificación nula ya que el comportamiento deseado se ha incluido con la primavera que los valores vacíos darán como resultado que se use el valor predeterminado. –

+1

Respuestas obsoletas, la mejor solución es de @AppLend –

57

puede mantenerse tipo primitivo mediante el establecimiento de valor predeterminado, en el su caso sólo tiene que añadir "requerido = false" propiedad:

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

P.S. Esta página de documentación de primavera podría ser útil: Annotation Type RequestParam

+0

Gracias, pero te perdiste el sentido de mi pregunta que está en el título. He pedido la posibilidad de suministrar params vacíos '/ test? I =' y dado que 'i' está vacío tiene el valor predeterminado. –

+1

De todos modos, cuando se proporciona '' 'defaultValue''',' '' required == false''' implícitamente –

+3

Si se proporciona el parámetro pero está vacío, 'defaultValue' no surte efecto. –

0

También puede hacer algo como esto -

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

Puede establecer RequestParam, utilizando Entero clase genérica en lugar de int, que va a resolver su problema.

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