2015-04-07 48 views
1

我有一个Jspresso应用程序在我的实体上使用侦听器。问题在于,当我修改侦听属性时,不会调用此侦听器。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()指令不导致invokation的听众。

回答

0

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

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

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

+1

该解决方案工作正常,但副作用是监听器在实体加载时触发,并不总是像您所说的那样需要。 我选择实现一个处理器而不是这种情况下的侦听器,因为它使更多的感知只有当集合被更改时才更改我的nbVehiclesPersisted。 因为它不完全是一个计算的属性,而是一个并非总是使用的计算属性的非规范化。 – Dealus

+0

连接时不应调用监听器。你看到不同的行为?使用处理器绝对是一个严肃的选择。 –

相关问题