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

时间:2017-01-30 23:01:26

标签: java wicket

假设以下多级结构:

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中创建不应发生的重复。

1 个答案:

答案 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对象(没有组件或模型本身)持有对模型的引用时,就会出现问题。