2

在我的 maven-wicket (6.10) 应用程序中,我有一个 TextField,它有一个整数类型的属性模型。我想设置数字输入到这个 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。我在源代码中只有这些验证器: 验证源 我如何使用数字验证器?或者我错过了什么,也许形成 pom.xml 对检票口的依赖关系?

4

2 回答 2

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是不切实际的。

另请注意,当您使用 Wicket 6 时,NumberValidator 的链接适用于 Wicket 1.4。与以前的版本相比,Wicket 6 是一个较大的 API 更改。

于 2014-02-07T22:30:10.747 回答
2

以供将来参考,请查看NumberTextField<N>

在 Op 的情况下,您可以更轻松地执行以下操作:

IModel<Integer> model = new PropertyModel<Integer>(personModel, "age");
add(new NumberTextField<Integer>("age", model).setMinimum(0).setMaximum(99));
于 2015-08-19T08:18:21.797 回答