2016-12-26 57 views
0

我正在学习焊接事件jboss weld event tutorial我想写一个例子,它观察事件并打印helloword时被触发。如何使用焊接事件(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(); 
    } 
} 

它不工作,并给下面的异常信息:

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

似乎是个趁着没有在容器中可以初始化

Event<MyEvent> events; 

那么我应该怎么做,使之运行,我 的beans.xml是空

  • 也许我应该在做些什么beans.xml
  • 或者我应该写一个java类实现事件接口
    任何东西都会被认识。
+0

注入类应该是容器的一部分,也就是说它应该在容器创建之后实例化并且具有类的注解。您应该将注释添加到Event,EventObserver,将EventTest分割为boostrap创建容器和@ Inject-able类。 beans.xml可以定义bean,但它仍然不会帮助,除非你分开EventTest类 –

+0

@ Alexander Anikin'@Inject @Any Event events;'我想我已经添加了对Event的注释,但麻烦确实发生在这个地方。我想我完全不理解你的想法,你能否提供更多细节?谢谢。 –

+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(); 
    } 
} 

你在main中启动容器,并对你的类使用托管引用。注入点只有在使用托管参考时才能解决。

+0

,谢谢,它的工作原理。 –

相关问题