2015-10-19 2 views
1

Я использую Wicket Wizard, чтобы позволить пользователю сделать несколько шагов для регистрации.
Но почему-то я получаю эту ошибку:Попытка установить объект модели на нулевую модель компонента: DropDownChoice

Last cause: Attempt to set model object on null model of component: wizard:form:view:sprachenDrop

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

И этот фрагмент из трассировки стека:

Root cause:
java.lang.IllegalStateException: Attempt to set model object on null model of component: wizard:form:view:sprachenDrop at org.apache.wicket.Component.setDefaultModelObject(Component.java:3038) at org.apache.wicket.markup.html.form.FormComponent.setModelObject(FormComponent.java:1577) at org.apache.wicket.markup.html.form.FormComponent.updateModel(FormComponent.java:1098) at org.apache.wicket.markup.html.form.Form$FormModelUpdateVisitor.component(Form.java:230) at org.apache.wicket.markup.html.form.Form$FormModelUpdateVisitor.component(Form.java:200)

отсылая к this post Я попытался создать класс для хранения информации, что мне нужно, но Бесполезный Я работаю, я взял this tutorial в качестве основного. Из самой справки Wicket я попробовал this code и таким образом создал класс IClusterable для хранения информации. Ошибка была прежней. Поскольку DropDownChoice поставляется с конструктором, способным хранить список как модель, я думал, что мой код должен работать.

public class StepPersoenlicheDaten extends WizardStep{ 
    private static final long serialVersionUID = 1L; 
    private RequiredTextField<String> name, vorname, strasse, ort, telefonNr; 
    private DropDownChoice<String> korrespondenzsprache; 
    private List<String> sprachen = new ArrayList<String>(); 


    public StepPersoenlicheDaten(WizardModel model) { 
     super(new ResourceModel("daten.title"), new ResourceModel("daten.summary")); 
     init(model); 
     java.util.Collections.addAll(sprachen, "Deutsch","English","Français","Italiano"); 

     add(name = new RequiredTextField<String>("name", Model.of(""))); 
     add(vorname = new RequiredTextField<String>("vorname", Model.of(""))); 
     add(strasse = new RequiredTextField<String>("strasse", Model.of(""))); 
     add(ort = new RequiredTextField<String>("ort", Model.of(""))); 
     add(telefonNr = new RequiredTextField<String>("telefonNr", Model.of(""))); 
     add(korrespondenzsprache = new DropDownChoice<String>("sprachenDrop", sprachen)); 
    } 
} 

Ошибка появляется, когда я нажимаю кнопку завершения (или следующей) в мастере. Я не знаю, что еще я мог бы исправить.

Edit:

IModel<Collection<? extends String>> langs = Model.of(sprachen); 
add(korrespondenzsprache = new DropDownChoice<String>("sprachenDrop", langs)); 

не был принят.

+1

Вам необходимо установить модель для Dropdownchoice. – soorapadman

+0

Модель, которая содержит список или модель, которая имеет выбор? –

+0

Я не знаю, почему вы устанавливаете такую ​​модель? Dropdownchoice - это String, который вы устанавливаете для коллекции моделей? в то же время, как этот StepPersoenlicheDaten вызывается на странице? у меня много путаницы? почему бы вам не создать переменную для раскрывающегося списка add getter/setter, а затем установить свойствоmodel? – soorapadman

ответ

1

Создайте локальную строку, такую ​​как private String sprachenDrop; и добавьте геттеры/сеттеры. Затем добавьте:

add(korrespondenzsprache = new DropDownChoice<String>("sprachenDrop", 
new PropertyModel(this, "sprachenDrop"), sprachen)); 

Должно работать.

+0

Это работает, но теперь вы делаете свою страницу в своем модельном объекте. Пожалуйста, не делайте этого, это плохая форма. Было бы лучше сделать добавление частного поля 'private IModel spracheModel;' и do 'spracheModel = Model.of ((String) null); add (korrespondenzsprache = new DropDownChoice («sprachenDrop», spracheModel, sprachen)); ' После отправки формы' spracheModel.getObject() 'предоставит вам выбранный язык. – Buurman