2010-02-18 8 views
7

내가 그렇게 같이 @RequestParam 어노테이션을 사용하고 싶습니다 그러나봄 @MVC 및 @RequestParam 검증

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

, 나는 사용자가 URL 매개 변수와 현악기로 이동하려고하면 1 페이지를 표시 할 페이지 "abz"또는 숫자가 아닌 것. 지금 당장 Spring이 할 수있는 최선의 방법은 500을 반환하는 것입니다. 문자열로 매개 변수를 사용하지 않고도이 동작을 완전히 재정의 할 수 있습니까?

나는 @ExceptionHandler 어노테이션을 보았지만, 내가 설정할 때 아무 것도하지 않는 것 같다. @ExceptionHandler(TypeMismatchException.class)을 사용한다. 왜 안되는지.

제안 사항?

P. 보너스 질문 : Spring MVC는 Spring MVC라고 불린다. Spring MVC라고 불리는 주석을 가진 Spring MVC인가? Google은이를 동일한 이름으로 취급합니다. 이는 성가신 일입니다.

+0

변수에 기본값을 할당하려고 시도 했습니까? @RequestParam에는이 기능이 있습니다. –

답변

8

스프링 3.0 이후로 ConversionService을 설정할 수 있습니다. @InitBindervalue는 해당 서비스를 적용 할 특정 매개 변수를 지정

@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)'가 호출 될 때마다 예외 java.lang.IllegalStateException : DataBinder가 이미 ConversionService로 초기화됩니다'가 throw됩니다. 너는 어떤 생각을 가지고 있니? –

+1

좋은 해결책이지만 "? page ="(빈 문자열을 매개 변수로 사용)와 같은 요청이 있으면'parse'가 전혀 호출되지 않으므로 페이지 매개 변수가 null로 설정됩니다. – Janning

10

ConversionService가 좋은 솔루션입니다,하지만 당신은 ?page= 같은 요청에 빈 문자열을주는 경우는 ConversionService가 단순히 호출되지 않습니다 값을 결여 모든하지만 page은 (Integer의 경우) null로 설정 또는 예외가

이 내 선호하는 솔루션입니다 (AN int의 경우) 발생합니다 :

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

이 방법을 사용하면 항상 유효한 int 매개 변수가 있습니다.

+0

아주 좋습니다. 감사. –