2010-02-18 21 views
7

ben şöyle @RequestParam ek açıklama kullanmak istiyorum: AncakBahar @MVC ve @RequestParam doğrulama

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

, ben kullanıcı URL parametreleriyle kemanlar ve gitmek çalışırsa sayfa 1 göstermek istiyorum sayfa "abz" veya sayısal olmayan bir şey. Şu anda, Spring'in yapabildiğim en iyi şey 500'lük bir getiri. Bu davranışı String olarak almak zorunda kalmadan temiz bir şekilde geçersiz kılmanın bir yolu var mı?

@ExceptionHandler ek açıklamasına baktım, ancak @ExceptionHandler(TypeMismatchException.class) kullanıyorum ayarlandığında hiçbir şey yapmıyor gibi görünüyor. Emin değil neden olmasın.

Öneriler?

P.S. Bonus sorusu: Spring MVC'ye Spring MVC denir. Spring MVC, ek açıklamalarla sadece Spring @MVC olarak adlandırılıyor mu? Google, onları aynı adla davranır, bu rahatsız edici bir durumdur.

+0

Değişken için bir varsayılan değer atamayı denediniz mi? @RequestParam bunun için bir imkan var. –

cevap

8

İlkbahar 3.0'dan beri bir ConversionService ayarlayabilirsiniz. @InitBinder 'ın value için bu hizmeti uygulamak için belirli bir parametreyi belirtir:

@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

"binder.setConversionService (s)" çağrıldığında, 'java.lang.IllegalStateException: DataBinder zaten ConversionService ile başlatıldı' istisnası atılır. Herhangi bir fikrin var mı? –

+1

Güzel bir çözüm, ancak "? Page =" gibi bir isteğiniz varsa (parametre olarak boş bir dize ile) "parse" hiç çağrılmadığı için sayfa parametresinin boş olarak ayarlanacağı üzücüdür. – Janning

10

ConversionService güzel bir çözümdür, ancak ?page= gibi isteğinize boş bir dize vermek eğer ConversionService basitçe çağrılmaz bir değeri yoksun hiç, ama page (Integer durumunda) null ayarlandığında veya İstisna

Bu benim tercih edilen çözüm (bir int durumunda) atılır:

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

Bu şekilde, her zaman geçerli bir int parametreniz vardır.

+0

Çok hoş. Teşekkürler. –