Попытка установить объект модели на нулевой модели компонента

Я новичок в Wicket, но гугление этой проблемы не дало мне ничего осмысленного. Поэтому я надеюсь, что кто-то в SO может помочь.

У меня есть объект SiteChoice, который расширяет Form, и объект SiteList, который расширяет DropDownChoice. Мой класс SiteChoice выглядит так:

  public class SiteChoice extends Form {
     public SiteChoice(String id) {
        super(id);

    addSiteDropDown();
     }

  private void addSiteDropDown() {

    ArrayList<DomainObj> siteList = new ArrayList<DomainObj>();
   // add objects to siteList

    ChoiceRenderer choiceRenderer = new ChoiceRenderer<DomainObj>("name", "URL");

    this.add(new SiteList("siteid",siteList,choiceRenderer));
   }
}

Затем я просто добавляю свой объект SiteChoice к моему объекту Page а-ля:

    SiteChoice form = new SiteChoice("testform");
    add(form);

Мой шаблон калитки имеет:

Когда я открываю страницу, она отображается нормально — раскрывающийся список отображается правильно. Когда я нажимаю «Отправить», я получаю эту странную ошибку:

WicketMessage: Method onFormSubmitted of interface 
  org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component   
 [MarkupContainer [Component id = fittest]] threw an exception

Root cause:

   java.lang.IllegalStateException: Attempt to set model object on null 
model of component: testform:siteid
    at org.apache.wicket.Component.setDefaultModelObject(Component.java:3033)
    at
  org.apache.wicket.markup.html.form.FormComponent.updateModel(FormComponent.java:1168)
   at 
 [snip]

Я не могу понять, что такое ноль. Он отрендерился нормально, поэтому он нашел объекты. Что мне не хватает?


person MikeHoss    schedule 10.08.2010    source источник


Ответы (1)


Ну, вы не показываете код для своего класса SiteList, но происходит то, что что-то — почти наверняка выпадающее меню — не имеет модели. Таким образом, когда калитка вызывает, по сути, dropdown.getModel().setModelObject( foo ) ;, она получает исключение нулевого указателя.

Я предлагаю следующее: следуя старому эмпирическому правилу объектно-ориентированного программирования, предпочитайте композицию наследованию. Ваши классы SiteChoice и SiteList, кажется, мало что добавляют, и они усложняют отладку ваших ошибок.

Вместо этого просто добавьте в форму DropDownChoice:

 form.add( new DropDownChioce( "siteid", 
                               new Model<DomainObject>(), 
                               new ChoiceRenderer<DomainObj>("name", "URL") );

Это также более лаконично,

person tpdi    schedule 10.08.2010