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类实现事件接口?
任何东西都会被认识。
注入类应该是容器的一部分,也就是说它应该在容器创建之后实例化并且具有类的注解。您应该将注释添加到Event,EventObserver,将EventTest分割为boostrap创建容器和@ Inject-able类。 beans.xml可以定义bean,但它仍然不会帮助,除非你分开EventTest类 –
@ Alexander Anikin'@Inject @Any Event events;'我想我已经添加了对Event的注释,但麻烦确实发生在这个地方。我想我完全不理解你的想法,你能否提供更多细节?谢谢。 –
EventTest不能直接使用容器注入,因为在创建时间类实例时将不提供注入。看看这里的Java SE 6示例:https://antoniogoncalves.org/2011/01/12/bootstrapping-cdi-in-several-environments/ –