在我的maven-wicket(6.10)应用程序中,我有一个TextField,它有一个Integer类型的属性模型。我想设置numberts的最大长度以键入此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(validators)的示例,但我无法解析NumberValidator。我在源代码中只有这些验证器: 我怎么能使用数字验证器?或者我错过了什么,可能形成pom.xml对wicket的依赖?
答案 0 :(得分:2)
为了将来参考,请查看NumberTextField<N>
在Op的案例中,你可以更容易地做到:
IModel<Integer> model = new PropertyModel<Integer>(personModel, "age");
add(new NumberTextField<Integer>("age", model).setMinimum(0).setMaximum(99));
答案 1 :(得分:1)
您面临的问题与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更改。