2010-02-18 30 views
7

me gustaría utilizar la anotación @RequestParam así:primavera @MVC y @RequestParam validación

@RequestMapping 
public void handleRequest(@RequestParam("page") int page) { 
    ... 
} 

Sin embargo, quiero mostrar la página 1 si el usuario juega con los parámetros de URL y trata de ir a página "abz" o algo no numérico. En este momento, lo mejor que puedo hacer para Spring es devolver 500. ¿Hay alguna manera de anular este comportamiento sin tener que tomar el parámetro como String?

Miré la anotación @ExceptionHandler, pero no parece hacer nada cuando configuro utilizo @ExceptionHandler(TypeMismatchException.class). No estoy seguro de por qué no.

Sugerencias?

P.S. Pregunta de bonificación: Spring MVC se llama Spring MVC. ¿Spring MVC con anotaciones simplemente se llama Spring @ MVC? Google los trata con el mismo nombre, lo cual es molesto.

+0

¿Intentó asignar un valor predeterminado para la variable. @RequestParam tiene una facilidad para esto. –

Respuesta

8

Desde Spring 3.0, puede establecer ConversionService. @InitBinder 's value especifica un parámetro en particular para aplicar ese servicio a:

@InitBinder("page") 
public void initBinder(WebDataBinder binder) { 
    FormattingConversionService s = new FormattingConversionService(); 
    s.addFormatterForFieldType(Integer.class, new Formatter<Integer>() { 
     public String print(Integer value, Locale locale) { 
      return value.toString(); 
     } 

     public Integer parse(String value, Locale locale) 
       throws ParseException { 
      try { 
       return Integer.valueOf(value); 
      } catch (NumberFormatException ex) { 
       return 1; 
      } 
     } 
    }); 
    binder.setConversionService(s); 
} 
+0

Siempre que se llame a 'binder.setConversionService (s)', se lanza la excepción 'java.lang.IllegalStateException: DataBinder ya se inicializó con ConversionService'. ¿Tiene alguna idea? –

+1

Buena solución, pero es triste que si tiene una solicitud como "? Page =" (por lo que con una cadena vacía como el parámetro) 'parse' no se llama en absoluto, por lo que el parámetro de la página se establecerá en nulo. – Janning

10

El ConversionService es una buena solución, pero carece de un valor si se le da una cadena vacía a su solicitud como ?page= El ConversionService simplemente no se llama en absoluto, pero page se establece en null (en caso de Integer) o se produce una excepción (en caso de una int)

Este es mi solución preferida:

@RequestMapping 
public void handleRequest(HttpServletRequest request) { 
    int page = ServletRequestUtils.getIntParameter(request, "page", 1); 
} 

De esta forma siempre tendrá un parámetro int válido.

+0

Muy agradable. Gracias. –

Cuestiones relacionadas