2010-02-18 21 views
7

Ich möchte die @RequestParam Anmerkung verwenden wie so:Frühling @MVC und @RequestParam Validierung

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

Allerdings möchte ich Seite 1 zeigen, wenn der Benutzer mit den URL-Parameter hantiert und versucht, um zu gehen Seite "abz" oder etwas nicht-numerisches. Im Moment ist das Beste, was Spring zu tun in der Lage ist, eine 500 zurückzugeben. Gibt es eine Möglichkeit, dieses Verhalten sauber zu übergehen, ohne den Parameter als String aufnehmen zu müssen?

Ich schaute auf die Annotation @ExceptionHandler, aber es scheint nichts zu tun, wenn ich setze ich @ExceptionHandler(TypeMismatchException.class). Nicht sicher warum nicht.

Vorschläge?

P.S. Bonusfrage: Spring MVC heißt Spring MVC. Ist Spring MVC mit Anmerkungen nur Spring @ MVC? Google behandelt sie als denselben Namen, was ärgerlich ist.

+0

Haben Sie versucht, einen Standardwert für die Variable zuzuweisen? @RequestParam hat eine Einrichtung dafür. –

Antwort

8

Seit Frühling 3.0 können Sie eine ConversionService setzen. @InitBinder ‚s value gibt einen bestimmten Parameter zu diesen Dienst gelten:

@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

Immer wenn 'binder.setConversionService (s)' aufgerufen wird, ist die Ausnahme 'java.lang.IllegalStateException: DataBinder ist bereits mit ConversionService initialisiert' is warf. Hast du irgendeine Idee? –

+1

Schöne Lösung, aber es ist traurig, dass, wenn Sie eine Anfrage wie "? Page =" (also mit einer leeren Zeichenfolge als Parameter) hat "Parse" überhaupt nicht aufgerufen wird, so wird der Seitenparameter auf Null festgelegt. – Janning

10

Die ConversionService ist eine schöne Lösung, aber es fehlt ein Wert, wenn Sie eine leere Zeichenfolge auf Ihre Anfrage wie ?page= Die ConversionService geben wird einfach nicht genannt überhaupt, aber page auf null (im Falle von Integer) gesetzt oder eine Ausnahme ausgelöst wird (im Falle eines int)

Dies ist meine bevorzugte Lösung:

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

Auf diese Weise haben Sie immer einen gültigen int-Parameter.

+0

Sehr schön. Vielen Dank. –

Verwandte Themen