Как проверить числовой формат TextField в калитке?

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

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

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 (валидаторы), но я не могу разрешить NumberValidator. У меня есть только эти валидаторы в источнике: validation sourceКак я могу использовать валидатор чисел? Или я что-то упустил, может быть, сформировать зависимости pom.xml для калитки?


person victorio    schedule 07.02.2014    source источник
comment
NumberTextField не вариант?   -  person Gimby    schedule 07.02.2014


Ответы (2)


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

Таким образом, вы должны использовать 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 по сравнению с предыдущими версиями.

person divanov    schedule 07.02.2014
comment
Спасибо, вроде неплохо! Но я сделал свой собственный NumberFormatValidator, но ваш ответ хорош! :-) - person victorio; 09.02.2014
comment
Конечно, определение собственного валидатора — еще один способ сделать это. Это единственное решение, например, если валидируемое значение должно быть в одном из двух диапазонов или быть нечетным. - person divanov; 09.02.2014

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

В случае Op вы можете сделать это проще:

IModel<Integer> model = new PropertyModel<Integer>(personModel, "age");
add(new NumberTextField<Integer>("age", model).setMinimum(0).setMaximum(99));
person Dave    schedule 19.08.2015