假设以下多级结构:
class Habitation {
private House house;
private List<Habitant> habitants;
}
此对象需要以平面形式显示给ListView中的每个居住者(这就是为什么多层对象需要以平面形式表示的原因),如下所示:
| habitant.name | house.address |
| ... | ... |
我认为这样做是正确的:创建像这样的&#34;桥接&#34; /链接对象:
class PlanarHabitant {
private IModel<House> house;
private IModel<Habitant> habitant;
}
此桥接对象是从Habitation
对象创建的,如下所示:
//Habitation.expand()
public List<PlanarHabitant> expand() {
List<PlanarHabitant> res = new ArrayList<PlanarHabitant>();
for (Habitant habitant : this.habitants) {
PlanarHabitant ph = new PlanarHabitant();
ph.setHouse(Model.of(this.house));
ph.setHabitant(Model.of(habitant));
res.add(ph);
}
return res;
}
此数据显示在ListView中。它是这样完成的:
final IModel<List<PlanarHabitant>> model = (IModel<List<PlanarHabitant>>) this.getDefaultModel();//model assigned is Model.ofList(Habitation.expand())
this.importList = new ListView<PlanarHabitant>("habitants", model) {
@Override
protected void populateItem(final ListItem<PlanarHabitant> item) {
item.add(new Label("cn", new PropertyModel(item.getModel(), "habitant.name")));
}
};
问题是标签的模型总是给出Field不存在的异常。
我尝试将CompoundPropertyModel
(和其他人)分配给PlanarHabitant
和不同的路径表达式,但没有任何效果。
我只是使用了错误的模型和路径表达式组合,还是完全错误的做法?
多级结构不应转换为平面的原因是它需要保存,PlanarHabitant
中House的重复将在DB中创建不应发生的重复。
答案 0 :(得分:2)
您正在构建嵌套对象的层次结构,其中包含模型:
Model
⟶ List<PlanarHabitant>
⟶* PlanarHabitant
⟶ Model<House>
⟶ House
⟶ Model<Habitant>
⟶ Habitant
每个ListView
项都有一个Model<PlanarHabitant>
(为您自动创建),因此您的属性表达式必须为"habitant.object.name"
。
当然最好跳过嵌套模型:
class PlanarHabitant {
private House house;
private Habitant habitant;
}
通常当您看到非Wicket对象(没有组件或模型本身)持有对模型的引用时,就会出现问题。