2010-08-11 14 views
6

Perdónenme por hacer una pregunta tan simple aquí ya que soy nuevo en Spring MVC 3.0. He estado leyendo la documentación del sitio web fuente de primavera un par de veces. He aquí un fragmento de código que me referiré a continuación a mi pregunta: -Spring MVC 3.0: ¿String es el tipo preferido para usar en @PathVariable?

@RequestMapping("/pets/{petId}") 
public void findPet(@PathVariable String petId, Model model) {  
// implementation omitted 
} 

Si tengo la intención de utilizar la plantilla URI basado en este ejemplo, es siempre preferible establecer el tipo @PathVariable ser de cadena a pesar de que espero que sea de otro tipo, como, un int? La documentación dice que la anotación @PathVariable puede ser de cualquier tipo simple, pero si Spring no puede convertir el id. De mascota no válido en un int (por ejemplo, el usuario ingresa algunos caracteres en lugar de números), arrojará una TypeMismatchException.

Entonces, ¿cuándo entra en juego el validador? ¿Dejo todos los tipos de @PathVariable en Cadena y tengo el validador para realizar la validación en los valores de Cadena, y si no hay un error de validación, entonces explícitamente convierte la Cadena al tipo deseado?

Gracias.

Respuesta

6
  1. Deje que el @PathVariable ser el tipo que espera, no necesariamente String
  2. Tener una página de error personalizado así. Si el usuario decide escribir algo en la URL, debe estar al tanto de las "consecuencias".
+0

Este enfoque funciona si el usuario construye la URL mismos. Sin embargo, no estoy seguro de cómo funcionará si el valor de petId proviene de un campo de texto abierto enviado desde un formulario. – limc

+1

, entonces eso no es un '@ PathVariable', sino un' @ RequestParam'. Y la validación debe hacerse en el lado del cliente, además de en el lado del servidor – Bozho

+0

Gracias por su explicación perspicaz, supongo que me confundí entre @pathvariable y @requestparam. – limc

7

Dijiste

pero si la primavera no es capaz de convertir el petId inválida en un int, arrojará un TypeMismatchException.

Ok. Pero usted puede manejar excepciones en el controlador a través de la anotación @ExceptionHandler planteado si quieres método

@ExceptionHandler(TypeMismatchException.class) 
public String handleIOException(TypeMismatchException e, HttpServletRequest request) { 
    // handle your Exception right here 
} 

manejador @ExceptionHandler firma es flexibe, Ver here

+0

y mi upvote va sobre el @ExceptionHandler, que no conocía;) – Bozho

+0

Tenerlo como String y atrapar la excepción tiene más control sobre la captura de TypeMismatchException.class, ¿qué sucede si quiero diferentes mensajes de error si llamo a diferentes métodos? –

Cuestiones relacionadas