我在wicket模型中有一个问题。由于公司的隐私,不能记下所有代码,我认为只有一部分是重要的。我的POJO java类是。期间是2个LocalDates类型的objets。
Class MyClass {
private List<Period> periods = new ArrayList<>();
public void setPeriods(List<Periods> periods) {
this.periods = periods;
}
public List<Period> getPeriods() {
return this.periods;
}
}
对于List,我有一个带dataTable的特殊面板,允许添加和删除句点。
Class MyPanel extends Panel {
public MyPanel(String id, IModel<List<Period>> model) {
super(id, model);
}
void onInitialize() {
Form<List<Period>> form = new Form<>("myPeriodsForm", model);
rebuildTable(form, null); // here is the code for dataTable building and updating via ajax(here is null).
}
}
我使用基于MyClass POJO的模型创建webPage,并将此模型插入到表单中。
CompoundPropertyModel propertyModel = new CompoundPropertyModel(getModel());
Form<MyClass> form = new Form<>("myForm", propertyModel);
form.add(new MyPanel("myPanel", propertyModel.bind("periods")));
form.add(new AjaxLinkButton("save", this::store));
....
private MyClass getObject() {
return form.getModelObject();
}
private void store(AjaxRequestTarget target, Form<?> form) {
myClassService.save(getObjetct()); // here is myClassService is autowired Spring Bean which storing object in database;
}
当我创建没有空列表期的WebPage时,我可以在dataTable中看到日期,我可以添加新的期间,可以删除期间。我做了调试,看到面板中的模型显示了我已添加的所有时段,因此应该正常工作。但是,当我尝试保存对象时,通过单击“保存”按钮,然后form.getModelObject()返回空List,即使插入时对象没有为空。
我试图将模型插入更改为我写的面板:
CompoundPropertyModel propertyModel = new CompoundPropertyModel(getModel());
Form<MyClass> form = new Form<>("myForm", propertyModel);
form.add(new MyPanel("myPanel", new CompoundPropertyModel(form.getModelObject().getPeriods())));// you see there now I'm getting List<> and creating compound model
form.add(new AjaxLinkButton("save", this::store));
现在点击ob保存按钮它可以从面板中获取所有期间。 我无法理解为什么会这样。
我意识到在某些时刻面板上发生了updateModel(),并且通过FormComponent类中的wicket代码:
public void updateModel() {
this.setModelObject(this.getConvertedInput());
}
所以,我已经覆盖了updateModel方法:
@Override
public void updateModel() {
setConvertedInput(getModelObject());
super.updateModel();
}
这意味着当面板和模板的模型发生变化时,convertedInput不会改变。
我现在知道为什么调用了updateModel,我在这里写了AjaxLinkButton,但实际上在代码中使用我们自己的按钮,它扩展了AjaxButton并提交表单。