Mhh Nie rozumiem ... jak wygląda twój aktualny kod przed wydarzeniem? ASFAIK wstrzykujesz interfejs javax.enterprise.event.Event i przekazujesz instancję do metody fire, która przez to deklaruje wywoływanego obserwatora. A jeśli w grę wchodzi dziedziczenie, tak jak w twoim przypadku, Observer zostanie wezwany, jeśli wystrzelisz DummyEvent. Jeśli chcesz dokładniej określić zdarzenia, w których będziesz używał kwalifikatorów.
@Inject @Any Event<DummyEvent> dummyEvent;
...
dummyEvent.fire(list.get(i));
/* edit */
"Problem" jest następujący wiersz kodu:
weld.event().select(MyEvent.class).fire(evt);
Jak najszybciej specifiy typ tej imprezy (MyEvent.class) rzeczywisty typ zdarzenia (evt) nie ma już znaczenia. Jedną z możliwości jest rozszerzenie klasy hirachy o kwalifikatory. Np:
@ChildEvent.Child
public class ChildEvent extends BaseEvent{
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface Child{
}
public void eventAction() {
System.out.println("child");
}
}
Potem dodatkowo określić Observer:
public void observerChild(@Observes @ChildEvent.Child BaseEvent child){
System.out.println("child with annotation event");
}
Wreszcie, gdy masz tylko dostęp do klas bazowych, tak jak w przykładzie, gdzie itarate poprzez listy, można określić dokładną typ/kwalifikator przed wypalaniem zdarzenie tak:
for (BaseEvent e : list){
childEvent.select(e.getClass().getAnnotations()[0]).fire(e);
}
jak wspomniano wyżej, jeśli masz ogólne Observer (pokazany poniżej), to zostanie wywołana dla każdego przypadku.
public void observerBase(@Observes BaseEvent base){
System.out.println("base event");
}
Którą implementację CDI używasz? –
spoina w jboss jako 7 –