我有一个 Errai 应用程序,CDI 事件未触发:
@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");
}
}
我认为这段代码非常简单,我想知道为什么它没有触发。
最佳答案
您的事件未被接收,因为它是 native JS 类型。问题是 Errai 的 Event
实现基于该事件类型的 Class
对象进行调度。这适用于普通类,甚至非原生 JS 类型。但原生 JS 类型实际上在运行时没有类;编译器将所有引用替换为 JavaScriptObject.class
。
在观察者方面,Errai 生成根据编译时计算出的类名注册观察者方法的代码。
因此存在不匹配,即使您的事件看起来像是为 Person
事件触发的,但它实际上是为 JavaScriptObject
的观察者分派(dispatch)的。
关于java - CDI 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43526947/