Попытка установить объект модели на нулевой модели компонента - PullRequest
4 голосов
/ 10 августа 2010

Я новичок в 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);

Шаблон моего Wicket имеет:

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

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]

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

1 Ответ

12 голосов
/ 10 августа 2010

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

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

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

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

Это также более кратко,

...