Jspresso:集合内容更改时未调用侦听器

Jspresso: Listener not invoked on collection content change

我有一个在我的实体上使用侦听器的 Jspresso 应用程序。问题是当我修改监听的 属性.

时,这个监听器没有被调用

监听器定义如下:

public WagonTransportOrderExtension(final WagonTransportOrder component) {

PropertyChangeListener nbVehiclesListener = new PropertyChangeListener() {

  @SuppressWarnings("unchecked")
  public void propertyChange(PropertyChangeEvent evt) {
    Integer nbVehicles = 0;
    Integer oldValue = getComponent().getNbVehiclesPersisted();

    for(LoadDetail detail : (Collection<LoadDetail>)evt.getNewValue()) {
      nbVehicles += detail.getQuantity();
    }

    getComponent().setNbVehiclesPersisted(nbVehicles);
    getComponent().firePropertyChange(
        WagonTransportOrder.NB_VEHICLES_PERSISTED, oldValue, nbVehicles);
  }
};

getComponent().addPropertyChangeListener(
    WagonTransportOrder.LOAD_DETAILS, nbVehiclesListener); 
}

以及此实体的一个简单用例:

WagonTransportOrder wagonTransportOrder = createEntityInstance(WagonTransportOrder)

Vehicle vehicle = createEntityInstance(Vehicle)
vehicle.setVin("00000000000000000")
save(vehicle)
wagonTransportOrder.addToLoadDetails(vehicle)

调试时,addToLoadDetails() 指令不会导致调用侦听器。

问题可能是当访问此扩展实现的第一个计算 属性 时延迟创建扩展实例,例如计算的 属性 的 getter 或 setter 被调用。

因此,根据一般经验,扩展不是创建侦听器并将其附加到实体(或组件)实例的好地方,除非这些侦听器与此扩展实现的计算属性直接相关,其中情况下,显然已创建扩展。

如果你总是需要这些监听器,我建议实现一个生命周期拦截器并将它们添加(或重新附加)在 onCreate / onClone / onLoad 方法。