2010-02-18 3 views
7

Я хотел бы использовать @RequestParam аннотацию, как так:Spring @MVC и @RequestParam проверки

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

Однако, я хочу показать страницу 1, если пользователь возится с параметрами URL и пытается перейти к страница «abz» или что-то не численное. Прямо сейчас, лучшее, что я могу заставить Spring сделать, это вернуть 500. Есть ли способ полностью переопределить это поведение, не принимая параметр в виде строки?

Я просмотрел аннотацию @ExceptionHandler, но, похоже, ничего не делает, когда устанавливаю, что использую @ExceptionHandler(TypeMismatchException.class). Не знаю, почему нет.

Предложения?

P.S. Бонусный вопрос: Spring MVC называется Spring MVC. Есть ли Spring MVC с аннотациями, которые просто называются Spring @MVC? Google рассматривает их как одно и то же имя, что раздражает.

+0

Вы пытались присвоить значение по умолчанию для переменной. @RequestParam имеет возможность для этого. –

ответ

8

С весны 3.0 вы можете установить ConversionService. @InitBinder «s value задает конкретный параметр, чтобы применить эту услугу:

@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'. Есть ли у вас какие-либо идеи? –

+1

Хорошее решение, но грустно, что если у вас есть запрос типа «? Page =» (поэтому с пустой строкой в ​​качестве параметра) 'parse' вообще не вызывается, поэтому параметр страницы будет иметь значение null. – Janning

10

ConversionService является хорошим решением, но ему не хватает значение, если дать пустую строку на ваш запрос как ?page= ConversionService просто не называется на всех, но page установлен в null (в случае Integer) или исключение (в случае int)

Это мое предпочтительное решение:

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

Таким образом, у вас всегда есть действительный параметр int.

+0

Очень приятно. Благодарю. –

Смежные вопросы