我使用PropertyModel
作为DropDownChoice
的一部分,如下所示:
List<String> choices = Arrays.asList(new String[] { "Library", "School Office", "Science Dept" });
String selected = "Library";
DropDownChoice<String> serviceDDC =
new DropDownChoice<String>("service", new PropertyModel(this, "choices.0"), choices);
不知怎的,我得到了这个例外:
caused by: org.apache.wicket.WicketRuntimeException: No get method defined for class: class com.samoo.tool.pages.CreatePrintingJob expression: choices
at org.apache.wicket.util.lang.PropertyResolver.getGetAndSetter(PropertyResolver.java:481)
at org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:332)
at org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:242)
at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:95)
at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:130)
at org.apache.wicket.Component.getDefaultModelObject(Component.java:1724)
....
我知道表达式有问题。我一直在尝试不同的参数输入,但它仍然无法正常工作。有人可以帮忙吗?
答案 0 :(得分:6)
由于您正在使用PropertyModel(this, "choices.0")
,Wicket正在尝试通过声明PropertyModel的类的方法choices
通过反射找到名为getChoices()
的属性。 com.samoo.tool.pages.CreatePrintingJob
中似乎不存在此方法,因为例外情况正在陈述。
此外,如果0
是索引,您应该使用[index]
表达式访问它,因为此JIRA问题表明:PropertyModel does not support index only property ("[0]")
但是,您似乎希望将DropDownChoice
初始化为choices
的第一个元素。但是,如果您将DropDownChoice的模型设置为PropertyModel(this, "choices.[0"])
,Wicket会做什么将以下列方式映射此DropDownChoice的选择:
choices
列表中的第一个元素。choices
列表的第一个位置。总结一下,表示DropDownChoice
选择的后备对象将是choices
列表中的第一个元素。
因此,您可能希望使用一个完全不同的模型,独立于选项列表,用于表示DDC选择的后备对象。
List<String> choices = Arrays.asList(new String[] { "Library", "School Office",
"Science Dept" });
String selected = "Library";
IModel dropdownModel = new Model<String>(choices[0]);
DropDownChoice<String> serviceDDC =
new DropDownChoice<String>("service", dropdownModel, choices);
您可能会发现以下链接很有用:
答案 1 :(得分:1)
您正在声明方法内部的选择,为了使PropertyModel工作,您需要在类级别而不是在方法级别上声明它。正如@XaviLópez指出的那样,表达方式并不正确,你需要使用选择。[0]
答案 2 :(得分:0)
最好使用IModel
代替PropertyMOdel
。PropertyModel
在重构时遇到很大问题。在我的情况下,我做到了,问题得到了解决。我也覆盖了toString()
对象的Topic
。
topicDropDown = new DropDownChoice<Topic>("topicOptions", new IModel<Topic>() {
@Override
public Topic getObject() {
return top;
}
@Override
public void setObject(Topic t) {
top = t;
}
@Override
public void detach() {
}
}, new LoadableDetachableModel<List<Topic>>() {
@Override
protected List<Topic> load() {
List<Topic> topics = top.getAllTopics();
return topics;
}
});