2012-01-28 13 views
8

CDIイベントでタイプ差異を使用することはできますか?ここケースである:私は根のイベントタイプがあるとし継承とCDIイベントのリストの使用方法は?

  • MyEventとサブクラスDummyEvent
  • 私の目標は、DummyEventインスタンス

を含む、イベントのリストがリモートソースList<? extends MyEvent>から受信し処理することですこれどうやってするの?

各イベントでfire()を呼び出すコレクションをループすると、@Observes MyEvent evtが呼び出されますが、@Observes DummyEvent evtのメソッドは呼び出されません。

**更新**

問題を明確にするサンプルコードを作成:

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

私は一度個別に、二回発射されるイベントが好きで、リストから1時間です。

+0

どのCDI実装を使用していますか? –

+0

weld in jboss 7 –

答えて

1

Mhh私はそれを取得しません...あなたの実際のコードはどのようにイベントを発射するように見えるのですか? ASFAIKでは、javax.enterprise.event.Eventインターフェイスを挿入し、呼び出されたオブザーバを宣言しているfireメソッドにインスタンスを渡します。あなたのケースのように継承が関与している場合は、ダミーイベントを発生させるとObserverが呼び出されます。さらにイベントを指定する場合は、修飾子を使用します。

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

/*編集*/

"問題は、" 次のコード行ですとすぐにイベントの種類(MyEvent.class)をspecifiyとして

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

、実際のイベントインスタンスのタイプ(evt)はそれ以上重要ではありません。 クラスヒイラージを修飾子で拡張する可能性があります。あなたはitarateどこあなただけのリストを、あなたの例のように、基底クラスにアクセスしているとき、あなたは正確に指定することができ、最後に

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

、:例えば:その後

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

はさらにオブザーバーを指定しますそのようなイベントを発射する前に、タイプ/修飾子:

for (BaseEvent e : list){ 
    childEvent.select(e.getClass().getAnnotations()[0]).fire(e); 
} 

前述したように、あなたは(下図参照)、一般的なオブザーバーを持っている場合、それはイベントごとに呼び出されます。

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

私が追加したばかりのコード例を見て、問題をもう少し明確にしたいと考えています。 –

+0

答えを編集しました。多分役立つかもしれません。 –

+0

それは役に立ちますが、タイプだけを使用した解決策があります...投稿してくれてありがとう、トリックを学んだ:) –

関連する問題