Ммм, я не понимаю... как выглядит ваш фактический код перед запуском события? ASFAIK вы вводите интерфейс javax.enterprise.event.Event и передаете экземпляр его методу огня, который тем самым объявляет вызываемый наблюдатель. И если задействовано наследование, как в вашем случае, оба наблюдателя будут вызываться, если вы запускаете DummyEvent. Если вы хотите дополнительно указать события, вы должны использовать квалификаторы.
@Inject @Any Event<DummyEvent> dummyEvent;
...
dummyEvent.fire(list.get(i));
/* изменить */
«Проблема» заключается в следующей строке кода:
weld.event().select(MyEvent.class).fire(evt);
Как только вы укажете тип события (MyEvent.class), фактический тип экземпляра события (evt) больше не имеет значения. Одна из возможностей — расширить иерархию классов с помощью квалификаций. Например:
@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");
}
}
После этого дополнительно укажите Наблюдателя:
public void observerChild(@Observes @ChildEvent.Child BaseEvent child){
System.out.println("child with annotation event");
}
Наконец, когда у вас есть только доступ к базовым классам, как в вашем примере, где вы перебираете список, вы можете указать точный тип/квалификатор перед запуском такого события:
for (BaseEvent e : list){
childEvent.select(e.getClass().getAnnotations()[0]).fire(e);
}
Как упоминалось выше, если у вас есть общий наблюдатель (показан ниже), он будет вызываться для каждого события.
public void observerBase(@Observes BaseEvent base){
System.out.println("base event");
}
person
Roland Tiefenbrunner
schedule
30.01.2012