GWT:如何在两个模块之间共享java对象(即:EventBus)

我正在构建一个大型应用程序,我想将它拆分为几个模块,如核心模块,用于初始化,用户管理等…,客户模块,生产模块等…

我想将它拆分为多个GWT模块(不使用GWT拆分技术)并共享一个EventBus,用于广播一些事件,如LoginEvent,LogoutEvent。 我不想使用代码分割技术,因为我想减少编译时间并仅重新编译我修改的模块。 这也允许通过在HTML主页中注释脚本标记来启用或禁用模块。

我使用JSNI编写了以下代码:

CoreModule's EntryPoint: private static SimpleEventBus eventBus = null; public void onModuleLoad() { export(); getEventBus().addHandler(MyEvent.TYPE, new MyEventHandler() { @Override public void onEvent(MyEvent myEvent) { Window.alert(myEvent.getMessage()); } }); } public static SimpleEventBus getEventBus() { if (eventBus == null) eventBus = new SimpleEventBus(); return eventBus; } public static native void export() /*-{ $wnd.getEventBus = $entry(@testExporter.client.TestExporter::getEventBus()); }-*/; CustomerModule's EntryPoint: public void onModuleLoad() { Button button = new Button("Click me"); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { getEventBus().fireEvent(new MyEvent("Button clicked !")); } }); RootPanel.get().add(button); } public static native SimpleEventBus getEventBus() /*-{ // Create a useless eventBus because the GWT compiler make a call to a null instance var eventBus = @com.google.gwt.event.shared.SimpleEventBus::new()(); eventBus = $wnd.getEventBus(); return eventBus; }-*/; 

但是在浏览器中执行时,我在Firebug中遇到以下exception:

 uncaugth exception [object Object] 

我还复制了实现/接口客户事件的MyEvent和MyEventHandler类。

PS:我也知道用于评论其他模块引用的技术,以避免编译它。

更简单的答案是不使用多个入口点。

==========================================

如果您要实现的目标是将代码分解为可管理的单元但希望在同一页面中使用所有代码,则可以:

  • 创建一个带有入口点的“Application.gwt.xml”模块(相当于你的初始化模块,如果我理解的话)
  • 创建没有入口点类的“UserManagement.gwt.xml”模块
  • 创建其他没有入口点的XXX模块

要创建一个没有入口点的模块,只需删除

  

来自你的gwt.xml文件,除了“应用程序”之外

然后,您需要使用这些模块包含在“应用程序”模块中

   

然后,您需要在模块“com.yourpackage.Application”的一个GWT构建中一起编译它们。

执行此操作时,请确保所有模块的已编译* .class和源.java文件在类路径中都可用。

您的“应用程序”入口点只需要初始化并使用其他模块中的对象

您不能在不同的GWT编译模块之间共享代码,除非您通过jsni使代码的某些部分可用并通过jsni调用这些导出的方法,就像您在查询中尝试一样。

但要注意:首先,共享类将是不兼容的,因为每个编译将以不同的方式重命名类/方法,其次,每个编译将删除不同的死代码片段。

所以在你的情况下,在window.getEventBus导出的方法中返回的SimpleEventBus在其他模块中是未知的,尽管其他模块也使用SimpleEventBus

做你想做的最简单的方法是使用GWT-exporter 。 首先正确选择要在每个模块中导出的js-api,如何命名,以及方便地实现Exportable和annotate方法。 第二,考虑您将使用哪些对象进行通信,因为其中一些可能是不兼容的。 我会使用GWT-exporter支持的原始类型,javascript对象和函数

我认为对于GWT-exporter,对于共享类,如果你在同一个命名空间中注释它们并导出相同的方法,希望你可以在所有模块中使用然后我不确定。

因此,通过jsni或gwt-exporter导出js API,并在它们之间传输纯原始或js对象。

您可以使用框架并通过WebMessage协议在模块之间建立通信。 只有当一个页面中的模块和模块处于分离战争时才有用。