1

エンティティでリスナーを使用する 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()命令はリスナーの呼び出しにつながりません。

4

1 に答える 1

0

問題は、この拡張機能によって実装された最初の計算されたプロパティがアクセスされたときに、拡張インスタンスが遅延して作成されることです。たとえば、計算されたプロパティのゲッターまたはセッターが呼び出されます。

そのため、一般的な経験則として、リスナーがこの拡張機能によって実装される計算されたプロパティに直接関連していない限り、拡張機能はリスナーを作成してエンティティ (またはコンポーネント) インスタンスにアタッチするのに適した場所ではありません。明らかに作成されました。

これらのリスナーが常に必要な場合は、ライフサイクル インターセプターを実装して // メソッドに追加 (または再アタッチ) することをお勧めonCreateonCloneますonLoad

于 2015-04-07T17:36:56.943 に答える