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

时间:2015-04-07 13:01:34

标签: java jspresso

我的实体上有一个使用侦听器的Jspresso应用程序。问题是当我修改listened属性时,不会调用这个监听器。

这是听众的定义:

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()指令不会导致监听器的调用。

1 个答案:

答案 0 :(得分:0)

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

因此,作为一般经验法则,扩展不是创建和将侦听器附加到实体(或组件)实例的好地方,除非这些侦听器与此扩展实现的计算属性直接相关,在这种情况下,显然是创建扩展名。

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