CDI 事件未触发
CDI events not firing
我有一个没有触发 CDI 事件的 Errai 应用程序:
@Dependent
@Templated
@Page(path = "person")
public class PersonPage extends Composite {
@Inject
@Loaded
Event<Person> loadedEvent;
@PageShowing
public void showing() {
Browser.getWindow().getConsole().log("Firing event..."); // works fine
loadedEvent.fire(new Person());
}
public void loaded(@Observes @Loaded Person person) {
Window.alert("Fired");
}
}
我认为这段代码非常简单,我想知道为什么它没有触发。
没有收到您的事件,因为它是原生 JS 类型。问题是 Errai 的 Event
实现基于该事件类型的 Class
对象进行调度。这适用于普通 classes 甚至非原生 JS 类型。但是原生 JS 类型在运行时实际上并没有 classes;编译器将所有引用替换为 JavaScriptObject.class
.
在观察者方面,Errai 生成代码,根据编译时计算出的class名称注册观察者方法。
因此存在不匹配,即使看起来您的事件正在为 Person
事件触发,但它实际上是为 JavaScriptObject
.
的观察者分派的
我有一个没有触发 CDI 事件的 Errai 应用程序:
@Dependent
@Templated
@Page(path = "person")
public class PersonPage extends Composite {
@Inject
@Loaded
Event<Person> loadedEvent;
@PageShowing
public void showing() {
Browser.getWindow().getConsole().log("Firing event..."); // works fine
loadedEvent.fire(new Person());
}
public void loaded(@Observes @Loaded Person person) {
Window.alert("Fired");
}
}
我认为这段代码非常简单,我想知道为什么它没有触发。
没有收到您的事件,因为它是原生 JS 类型。问题是 Errai 的 Event
实现基于该事件类型的 Class
对象进行调度。这适用于普通 classes 甚至非原生 JS 类型。但是原生 JS 类型在运行时实际上并没有 classes;编译器将所有引用替换为 JavaScriptObject.class
.
在观察者方面,Errai 生成代码,根据编译时计算出的class名称注册观察者方法。
因此存在不匹配,即使看起来您的事件正在为 Person
事件触发,但它实际上是为 JavaScriptObject
.