2012-01-28 16 views
8

CDI olaylarında tip varyansı kullanmak mümkün mü? Burada böyledir: i kök olay türüne sahip varsayalımCDI olaylarının kalıtım ve listeleri nasıl kullanılır?

  • MyEvent ve alt sınıf DummyEvent
  • Amacım DummyEvent örneklerini

içeren olayların bir listesini uzak bir kaynaktan List<? extends MyEvent> alınan işlenmesidir Bunu nasıl yapabilirim?

Her olayda fire() numaralı çağrıyı arayarak, @Observes MyEvent evt'u çağırır, ancak @Observes DummyEvent evt yöntemlerini kullanmaz.

** güncelleme ** konuyu netleştirmek için bir örnek kod düzenlendi

: listeden Ben bir kez ayrı ayrı iki kez ateş etmek olayını istiyorum

https://github.com/jfaerman/jfaerman/blob/master/test-cdi/src/main/java/jfaerman/App.java

ve bir kez .

+0

Hangi CDI Uygulamasını kullanıyorsunuz? –

+0

jboss olarak kaynak yapın 7 –

cevap

1

Mhh Anlamadım ... gerçek kodun olayları nasıl tetiklediği nasıl görünüyor? ASFAIK javax.enterprise.event.Event arayüzünü enjekte ettiniz ve buna örnek olarak adlandırılan gözlemciyi ilan eden yangın yöntemine iletiniz. Ve eğer miras söz konusu ise, sizin durumunuzda olduğu gibi, bir DummyEvent'i ateşlerseniz her iki Gözlemci de çağrılır. Olayları daha fazla belirtmek isterseniz, Elemedarları kullanırdınız.

@Inject @Any Event<DummyEvent> dummyEvent; 
... 
dummyEvent.fire(list.get(i)); 

/* edit */

"Sorun" aşağıdaki kod satırı: En kısa sürede, etkinliğin türünü (MyEvent.class) specifiy olarak

weld.event().select(MyEvent.class).fire(evt); 

, gerçek olay örneğinin türü (evt) artık önemli değil. Bir olasılık, sınıf hiraşinizi Qualifiers ile genişletmektir. Eğer itarate burada sadece bir liste aracılığıyla örnekte olduğu gibi, baz sınıflara erişmek ne zaman sen kesin belirtebilirsiniz, Nihayet

public void observerChild(@Observes @ChildEvent.Child BaseEvent child){ 
     System.out.println("child with annotation event"); 
} 

,: Ör: Bundan sonra

@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"); 
    }  
} 

ayrıca Gözlemci belirtmek böyle olay ateş önce/eleme yazın:

(aşağıda gösterilmektedir) genel Observer varsa, yukarıda belirtildiği gibi
for (BaseEvent e : list){ 
    childEvent.select(e.getClass().getAnnotations()[0]).fire(e); 
} 

, her olay için çağrılır.bu servlet tarafından test olarak

public void observerBase(@Observes BaseEvent base){ 
    System.out.println("base event"); 
} 
+0

Lütfen eklediğim kod örneğine bakın, sorunu biraz daha açık hale getirmeyi umuyoruz. –

+0

Cevabı düzenleyin, belki yardımcı olur. –

+0

Bu yardımcı olur, ama ben sadece türleri kullanarak bir çözüm ... gönderme için teşekkürler, hile öğrendim :) –