Исключение выражения PropertyModel: org.apache.wicket.WicketRuntimeException: метод get для класса не определен: - PullRequest
3 голосов
/ 25 ноября 2011

Я использовал 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)

....

Я знаю, что с выражением что-то не так. Я пробовал вводить разные параметры, но он все еще не работает. Может ли кто-нибудь помочь?

Ответы [ 3 ]

6 голосов
/ 25 ноября 2011

Поскольку вы используете PropertyModel(this, "choices.0"), Wicket пытается найти свойство с именем choices посредством отражения с помощью метода getChoices() класса, объявившего PropertyModel.Этот метод, кажется, не существует в com.samoo.tool.pages.CreatePrintingJob, как об этом говорится в исключении.

Кроме того, если этот 0 является индексом, вы должны обращаться к нему с помощью выражения [index], так какПроблема JIRA предполагает: PropertyModel не поддерживает свойство только для индекса ("[0]")

Однако, похоже, вы хотите инициализировать DropDownChoice первым элементом choices,Но то, что будет делать Wicket, если вы установите для DropDownChoice Model значение PropertyModel(this, "choices.[0"]), будет отображать выбор этого 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 голос
/ 25 ноября 2011

вы объявляете выбор внутри метода, чтобы заставить PropertyModel работать, вам нужно объявить его на уровне класса, а не на уровне метода.Как заметил @Xavi López, эспрессия - не то, что вам нужно использовать выбор. [0]

0 голосов
/ 27 марта 2013

Рекомендуется использовать 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;

        }
    });
...