2010-02-18 14 views
7

Chciałbym użyć adnotacji @RequestParam tak:Wiosna @MVC i @RequestParam walidacja

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

Jednakże chcę pokazać strona 1, jeśli użytkownik bawi się z parametrów URL i próbuje przejść do strona "abz" lub coś nieliczbowego. W tej chwili najlepsze, co mogę zrobić, to Spring, aby zwrócić 500. Czy istnieje sposób, aby nadpisać to zachowanie w sposób czysty, bez konieczności pobierania parametru jako String?

Spojrzałem na adnotację @ExceptionHandler, ale nie wydaje się, aby cokolwiek, gdy ustawiam, używam @ExceptionHandler(TypeMismatchException.class). Nie wiem, dlaczego nie.

Sugestie?

P.S. Dodatkowe pytanie: Spring MVC nazywa się Spring MVC. Czy Spring MVC zawiera adnotacje o nazwie Spring @MVC? Google traktuje je jako to samo imię, co jest denerwujące.

+0

Czy próbowałeś przypisać wartość domyślną dla zmiennej. @RequestParam ma do tego obiekt. –

Odpowiedz

8

Od wiosny 3.0 można ustawić ConversionService. @InitBinder „s value określa konkretny parametr, aby zastosować tę usługę:

@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

Gdy wywoływana jest 'binder.setConversionService (s)', wyjątek 'java.lang.IllegalStateException: DataBinder jest już zainicjalizowany przez ConversionService' jest rzucany. Masz jakiś pomysł? –

+1

Ładne rozwiązanie, ale to smutne, że jeśli masz takie żądanie jak "? Page =" (tak, że z pustym ciągiem jako parametrem), 'parsowanie' nie jest w ogóle wywoływane, więc parametr strony zostanie ustawiony na wartość null. – Janning

10

ConversionService jest ładne rozwiązanie, ale brakuje w nim wartości, jeśli dasz pusty ciąg na żądanie jak ?page= ConversionService nie jest nazywana po prostu w ogóle, ale page jest ustawiony null (w przypadku Integer) lub jest wyjątek (w przypadku int)

to my preferowanym rozwiązaniem:

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

W ten sposób zawsze masz poprawny parametr int.

+0

Bardzo ładne. Dzięki. –