当前位置: 首页 > 知识库问答 >
问题:

如何在焊接中使用事件(cdi)

杨雪松
2023-03-14

我正在学习jboss Weld Event教程中的Weld Event,我想写一个观察事件并在事件被激发时打印helloword的示例。

这是我的代码:

//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)

容器中似乎没有可以初始化的bean

Event<MyEvent> events;

那么我该怎么做才能使它运行,我的beans.xml是空的

  • 也许我应该在beans.xml中做些什么?
  • 或者我应该编写一个实现事件接口的Java类?
    任何内容都将适用。

共有1个答案

国高杰
2023-03-14

基本上,代码失败是因为您没有使用类的托管实例。这里有一个更好的方法

@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中启动容器,并使用对类的托管引用。只有在使用托管引用时才解析注入点。

 类似资料:
  • 我有,和Eclipse Maven项目。 包含: 接口。 IMyConfig的实现。 实现,具有属性。 "空"文件。 一个的实现,标记为。 一个类(和方法),初始化Weld SE并检索一个bean。 一个,其中在部分中列出。 现在,我运行类,并且成功地检索了bean(作为实例)。但是这样的实例在其属性中被注入了实例,而不是替代版本() 我正在使用Eclipse Luna M2Eclipse。 我做

  • 我用LettuceConnectionFactory定义了RedisTemplate,但我不知道如何创建连接事件,例如在https://github.com/lettuce-io/lettuce-core/wiki/Connection-Events. 如何使用RedisTemboard获取RedisClient实例?

  • 我想在下面的文本框中捕捉enter键按下事件。为了更清楚地说明这一点,我使用了一个ng repeat来填充tbody。以下是HTML: 这是我的模块: 我正在使用资源填充表格,我的控制器代码是:

  • 问题内容: 我想在下面的文本框中捕获Enter键按下事件。为了更清楚地说明,我使用a 来填充tbody。这是HTML: 这是我的模块: 我正在使用一种资源来填充表,而我的控制器代码是: 问题答案: 您需要添加,如下所示: Javascript : HTML :

  • 我有一个基于Java EE6CDI的应用程序,运行在JBoss 7.1.1版本上,它也包含一些会话bean。 }

  • 我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得) 任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。 所以我尝试了几种方法:1。 2.我将返回类型更改为对象。 在这两种情况下,我都会收到由:org引起的下一个异常。jboss。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnot