2016-12-26 9 views
0

私は勉強中ですウェルドイベントからjboss weld event tutorialまでです。イベントが発生したときにそれを見て、プリントヘルラーを見てみましょう。 溶接でイベントを使用する方法(cdi)

この

は私のコードです:

//MyEvent when it was fired, print HelloWorld 
public class MyEvent{} 

//observe MyEvent and when it happen print HelloWorld 
public class EventObserver { 
    public void demo(@Observes MyEvent event){ 
     System.out.println("HelloWorld"); 
    } 
} 

//Main Class fire Event in demo method 
public class EventTest { 
    @Inject @Any Event<MyEvent> events; 
    public void demo(){ 
     Weld weld = new Weld(); 
     WeldContainer container = weld.initialize(); 
     events.fire(new MyEvent()); 
     container.shutdown(); 
    } 
    public static void main(String[] args){ 
     EventTest test = new EventTest(); 
     test.demo(); 
    } 
} 

それdoesntの仕事と例外情報の下に与える:

Exception in thread "main" java.lang.NullPointerException 
     at weldLearn.event.EventTest.demo(EventTest.java:18) 
     at weldLearn.event.EventTest.main(EventTest.java:24) 

それは番目のようですEREは、初期化することができ、コンテナにはません

Event<MyEvent> events; 

その後、私はそれが私の beans.xmlの

  • は、たぶん私はで何かを行う必要が空である、ランニング作るために何をすべきかbeans.xml
  • またはJavaクラスを作成する必要がありますイベントインターフェイス
    何かが評価されます。
+0

注入のクラスはコンテナの一部でなければなりません。つまり、コンテナの作成後にインスタンス化され、クラスの注釈があります。注釈をEvent、EventObserverに追加し、EventTestをboostrap作成コンテナと@ Injectableクラスに分割する必要があります。 beans.xmlはBeanを定義できますが、EventTestクラスを分割しない限り、まだ助けになりません。 –

+0

@ Alexander Anikin '@Inject @Anyイベントイベント;イベントに注釈を追加したと思いますが、ここで問題は発生します。私はあなたのアイデアを完全に理解していないと思う、詳細を教えてくれますか?ありがとうございました。 –

+1

EventTestでは、コンテナインジェクションを直接使用することはできません。インジェクションは、インスタンスが作成されたタイムクラスによって処理されないためです。ここでJava SE 6の例を見てください:https://antoniogoncalves.org/2011/01/12/bootstrapping-cdi-in-several-environments/ –

答えて

0

基本的に、クラスの管理インスタンスを使用していないため、コードが失敗します。ここではより良い方法があります。

@ApplicationScoped 
public class EventTest { 
    @Inject Event<MyEvent> events; 
    public void demo(){ 
     events.fire(new MyEvent()); 
    } 
    public static void main(String[] args){ 
    Weld weld = new Weld(); 
    WeldContainer container = weld.initialize(); 
    EventTest test = container.select(EventTest.class).get(); 
    test.demo(); 
    container.shutdown(); 
    } 
} 

メインでコンテナを起動し、クラスの管理参照を使用します。注入点は、管理参照を使用している場合にのみ解決されます。

+0

、ありがとう、それは動作します。 –

関連する問題