【问题标题】:CDI events not firingCDI 事件未触发
【发布时间】:2017-04-20 18:14:40
【问题描述】:

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

}

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

【问题讨论】:

  • showing 方法真的被调用了吗?您是否从不同的 (@Singleton) 实例观察事件?
  • 顺便说一句,我指的这个 Person 对象是@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
  • 可能@JsType 干扰了事件机制,您是否尝试将Person 类包装在一个普通的java 类中?
  • @k5_ 不是真的,因为我们的模型是基于 JsInterop 的
  • 观察者方法必须在另一个bean中,而不是在触发事件的同一个bean中。

标签: java gwt errai


【解决方案1】:

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

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

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

【讨论】:

  • 是否意味着这种情况没有解决方法?
  • 在 Java 类中包装 Person 应该可以工作(例如 PersonEventPersonWrapper)。不是很好,但有工作的好处。
  • 现在,您必须按照@k5_ 的建议包装它。考虑打开一个 JIRA 问题以进行增强以支持此用例。我们可能会在未来的版本中支持触发原生 JS 类型。
  • @k5_ 感谢您的建议有效。如果您愿意,可以在这里回答。
猜你喜欢
  • 2016-11-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2010-11-08
  • 2019-01-31
  • 2013-04-09
  • 2015-07-25
相关资源
最近更新 更多