Наследование событий CDI

Есть ли способ использовать наследование классов с событиями CDI?

Допустим, у меня есть что-то вроде этого:

public class ParentEvent{}

public class ChildEvent extends ParentEvent{}

и что-то вроде этого:

public class Manager(){
    @Inject 
    private Event<ParrentEvent> event;

    public void foo(){
        event.fire(new ParentEvent());
    }

    public void bar(){
        event.fire(new ChildtEvent());
    }        
}

public class Observer{

      public void observesParent(@Observes ParentEvent event){
          //do something
      }

      public void observesChild(@Observes ChildEvent event){
          //do something
      }
}

В этом случае как ParentEvent, так и ChildEvent обрабатываются с помощьюObservesParent() - из-за типа атрибута события в классе Manager. Есть ли способ наблюдать за ChildEvent с помощью обоих методов наблюдателя?


person pseudo    schedule 10.06.2012    source источник
comment
Я бы рекомендовал, чтобы ваши события CDI были неизменными и окончательными, чтобы избежать каких-либо неожиданностей. Я не уверен, что было бы хорошей идеей разрешать модификацию поведения чем-либо, наследованием или иным образом.   -  person Jonathan S. Fisher    schedule 19.06.2012


Ответы (1)


Идея CDI заключается в использовании квалификаторов в сочетании с событиями/наблюдателями (а не в наследовании). Проверьте эту главу в документации Weld. Желаемое поведение должно быть легко достижимо с помощью чего-то вроде этого:

public class Manager(){
    @Inject
    @Parent
    private Event<MyEvent> parentEvent;

    @Inject
    @Child
    private Event<MyEvent> childEvent; 

// ...

    public void foo(){
        event.fire(parentEvent);
    }

    public void bar(){
        event.fire(childEvent);
    }
}


public void observeChild(@Observes @Child MyEvent myEvent) { ... }
public void observeParent(@Observes @Parent MyEvent myEvent) { ... }
public void observeAll(@Observes MyEvent myEvent) { ... }

Это гораздо более гибко, чем использование наследования...

person jan groth    schedule 11.06.2012
comment
Основная проблема заключается в том, что вы не можете абстрагировать механизм наблюдения (я имею в виду сторону наблюдателя) с квалифицированными или общими событиями. Было бы интересно сделать это, например, предоставить какую-то структуру, используемую бизнес-уровнем вашего приложения. - person kij; 25.02.2014