模型链接/"bridging" 将多级结构读取为平面

Model chaining/"bridging" to read Multi-level structure as planar

假设如下多级结构:

class Habitation {
  private House house;
  private List<Habitant> habitants;
}

此对象需要以平面形式显示在 ListView 中的每个居民(这就是为什么多级对象需要以平面形式表示),如下所示:

| habitant.name | house.address |
|      ...      |      ...      |

我认为这样做是正确的:创建一个 "bridging"/chaining 对象,如下所示:

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")));
        }
    };

问题是标签模型总是给出字段不存在的异常。

我试图将 CompoundPropertyModel(和其他)分配给 PlanarHabitant 和不同的路径表达式,但没有任何效果。

我只是使用了错误的模型和路径表达式组合,还是完全错误的方法?

多层结构不应转换为平面结构的原因是它需要保存,PlanarHabitant 中 House 的重复将在 DB 中创建重复,这不应该发生。

您正在构建嵌套对象的层次结构,模型介于两者之间:

Model
 ⟶ List<PlanarHabitant>
     ⟶* PlanarHabitant
          ⟶ Model<House>
              ⟶ House
          ⟶ Model<Habitant>
              ⟶ Habitant

每个 ListView 的项目都有一个 Model<PlanarHabitant>(自动为您创建),因此您的 属性 表达式必须是 "habitant.object.name".

当然最好跳过嵌套模型:

class PlanarHabitant {
  private House house;
  private Habitant habitant;
}

通常,当您看到 non-Wicket 个对象(既没有组件也没有模型本身)持有对模型的引用时,就会出现问题。