繁体   English   中英

PropertyModel Expression的异常:org.apache.wicket.WicketRuntimeException:没有为类定义get方法:

[英]PropertyModel Expression's Exception : org.apache.wicket.WicketRuntimeException: No get method defined for class:

我使用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)

....

我知道表达式有问题。 我一直在尝试不同的参数输入,但它仍然无法正常工作。 有人可以帮忙吗?

由于你正在使用PropertyModel(this, "choices.0") ,Wicket试图通过声明PropertyModel的类的方法getChoices()通过反射找到一个名为choices的属性。 com.samoo.tool.pages.CreatePrintingJob似乎不存在此方法,因为异常是在说明。

此外,如果0是索引,则应使用[index]表达式访问它,因为此JIRA问题表明: PropertyModel不支持仅索引属性(“[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);

您可能会发现以下链接很有用:

你在方法中声明了选择,为了使PropertyModel工作,你需要在类级别而不是在方法级别上声明它。 正如@XaviLópez所指出的那样,表达方式并不正确,你需要使用选择。[0]

最好使用IModel而不是PropertyMOdel PropertyModel在重构方面存在很大问题。 在我的情况下,我做了它并且问题正确解决。我也覆盖了我的Topic对象的toString()

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;

        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM