CDI事件没有解雇

时间:2017-04-20 18:14:40

标签: java gwt errai

我有一个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");
    }

}

我认为这段代码非常简单,我想知道为什么它没有解雇。

1 个答案:

答案 0 :(得分:4)

您的活动未收到,因为它是原生JS类型。问题在于,Errai的Event实现基于该事件类型的Class对象进行调度。这适用于普通类甚至非本机JS类型。但是原生的JS类型实际上并没有在运行时拥有类;编译器用JavaScriptObject.class替换任何引用。

在观察者方面,Errai生成的代码根据在编译时计算出的类名来注册观察者方法

因此存在不匹配,即使看起来您的事件正在为Person事件触发,但实际上正在为JavaScriptObject的观察者发送它。