2014-02-07 2 views
1

В моем приложении maven-wicket (6.10) у меня есть TextField, который имеет модель свойства Integer. Я хочу установить максимальную длину для ввода чисел в этот TextField. (Например, пользователь должен написать максимум 2 символа в «возрасте» текстовое поле)Как проверить формат чисел TextField в калитки?

Я попробовал этот код:

add(new TextField<>("age",new PropertyModel<(personModel,"age")) 
    .add(StringValidator.maximumLength(2))); 
//age is an Integer value from a Person class, personModel is "IModel<Person>" type 

, но я получил это исключение:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String 
    at org.apache.wicket.validation.validator.StringValidator.getValue(StringValidator.java:87) 
    at org.apache.wicket.validation.validator.StringValidator.getValue(StringValidator.java:59) 
    at org.apache.wicket.validation.validator.AbstractRangeValidator.validate(AbstractRangeValidator.java:107) 
    at org.apache.wicket.markup.html.form.FormComponent.validateValidators(FormComponent.java:1523) 

Так что если модель свойства не является строковым типом, я не могу использовать StringValidator. Я нашел примеры, которые используют NumberValidator (validators), но я не могу разрешить NumberValidator. У меня есть только эти валидаторы в источнике: validation source Как я могу использовать валидатор чисел? Или я что-то упускаю, возможно, формирует зависимости pom.xml для калитки?

+0

NumberTextField не вариант? – Gimby

ответ

1

Проблема, с которой вы сталкиваетесь, связана с тем, как работает калитка. Сначала он преобразует входной текст в объект модели, а затем выполняет проверку.

Таким образом, вы должны использовать RangeValidator вместо StringValidator

IModel<Integer> model = 
    new PropertyModel<Integer>(personModel, "age"); 
Component ageField = new TextField<Integer>("age", model); 
add(ageField).add(RangeValidator.<Integer>range(0, 99)); 

Примечания Я меняю Long к Integer, как я считаю, сохранение возраста как Long не практично.

Также обратите внимание на ссылку на NumberValidator для Wicket 1.4, в то время как вы используете Wicket 6. Wicket 6 - это большое изменение API по сравнению с предыдущими версиями.

+0

Спасибо, это выглядит хорошо! Но я сделал свой собственный NumberFormatValidator, но ваш ответ хорош! :-) – victorio

+1

Конечно, определение вашего собственного валидатора - это еще один способ сделать это. Это единственное решение, например, если проверенное значение должно быть в одном из двух диапазонов или нечетно. – divanov

2

Для дальнейшего использования, пожалуйста, посмотрите на NumberTextField<N>

В случае Op, вы могли бы сделать более легко, как:

IModel<Integer> model = new PropertyModel<Integer>(personModel, "age"); 
add(new NumberTextField<Integer>("age", model).setMinimum(0).setMaximum(99)); 
Смежные вопросы