Wie werden Vererbung und Listen von CDI-Ereignissen verwendet?

8

Ist es möglich, Typvarianz in CDI-Ereignissen zu verwenden? Hier ist der Fall:

  • Angenommen, ich habe einen Root-Ereignistyp MyEvent und Unterklasse DummyEvent
  • Mein Ziel ist es, eine Liste von Ereignissen zu verarbeiten, die von einer entfernten Quelle List<? extends MyEvent> mit DummyEvent instances
  • empfangen wurden

Wie kann ich das tun?

Wenn ich bei jedem Ereignis durch die Sammlung rufe, die fire() aufruft, wird @Observes MyEvent evt aber nicht @Observes DummyEvent evt Methoden aufgerufen.

** Aktualisierung **

Erstellt einen Beispielcode, um das Problem zu klären:

Ссылка

Ich möchte, dass das Ereignis zweimal ausgelöst wird, einmal einzeln und einmal aus der Liste.

    
Julio_AWS_DevRel 28.01.2012, 02:28
quelle

2 Antworten

3

Es funktioniert, indem der BeanManager instad des Ereignisses injiziert wird, wie von diesem Servlet getestet:

Ссылка

Beantwortet von Jozef Hartinger in diesem Thread im Weld-Forum:

Ссылка

    
Julio_AWS_DevRel 13.02.2012, 15:35
quelle
1

Mhh Ich verstehe es nicht ... Wie sieht dein Code aus, um das Event zu feuern? ASFAIK injizieren Sie die Schnittstelle javax.enterprise.event.Event und übergeben Sie eine Instanz an ihre fire-Methode, die damit den aufgerufenen Beobachter deklariert. Und wenn eine Vererbung involviert ist, würden beide Observer aufgerufen werden, wenn Sie ein DummyEvent auslösen. Wenn Sie die Ereignisse weiter spezifizieren möchten, würden Sie Qualifier verwenden.

%Vor%

/ * bearbeiten * /

Das "Problem" ist die folgende Codezeile:

%Vor%

Sobald Sie den Ereignistyp (MyEvent.class) angeben, spielt der Typ der tatsächlichen Ereignisinstanz (evt) keine Rolle mehr. Eine Möglichkeit ist es, den Klassenhirach mit Qualifiern zu erweitern. ZB:

%Vor%

Danach spezifizieren Sie den Beobachter weiter:

%Vor%

Schließlich, wenn Sie gerade Zugriff auf Basisklassen haben, wie in Ihrem Beispiel, wo Sie durch eine Liste gehen, können Sie den genauen Typ / Qualifier angeben, bevor Sie das Ereignis wie folgt auslösen:

%Vor%

Wie oben erwähnt, wenn Sie einen allgemeinen Beobachter haben (siehe unten), wird er für jedes Ereignis aufgerufen.

%Vor%     
Roland Tiefenbrunner 30.01.2012 20:33
quelle