Проверка Spring @MVC и @RequestParam - PullRequest
7 голосов
/ 18 февраля 2010

Я хотел бы использовать аннотацию @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 воспринимает их как одно и то же имя, что раздражает.

Ответы [ 2 ]

10 голосов
/ 29 августа 2011

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

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

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

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

8 голосов
/ 18 февраля 2010

Начиная с Spring 3.0, вы можете установить ConversionService. @InitBinder '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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...