2016-09-16 34 views
0

我想从使用编译器标志-XjsInteropMode JS迁移,但我遇到了问题。GWT JsInterop迁移

我有一个名为Module的界面,看起来像这样:

@JsType 
public interface Module { 
    @JsProperty 
    String getBasename(); 
} 

然后,我有叫AuthenticationModule另一个界面,看起来像这样:

@JsType 
public interface AuthenticationModule extends Module { 
    static final String MODULE_NAME = "authentication"; 

    void logIn(String username, String password, JsConsumer<JavaScriptObject> onSuccess, JsConsumer<JavaScriptObject> onError); 

    void logOut(JsConsumer<JavaScriptObject> onSuccess, JsConsumer<JavaScriptObject> onError); 
} 

模块接口只是一个标记接口,所以当我加载一些模块时,我能够将它最终投射到我想要的模块,例如:

@Override 
    public void getAuthenticationModule(
      OnModuleLoaded<AuthenticationModule> onModuleLoaded) { 
     initializeIfNecessary(); 
     JsArrayString requiredModules = JavaScriptObject.createArray().cast(); 
     requiredModules.push(AuthenticationModule.MODULE_NAME); 
     modules.require(requiredModules, loadedModule -> { 
      onModuleLoaded.moduleLoaded((AuthenticationModule) loadedModule); // this line (the casting) throws ClassCastException 
     }); 
    } 
在这个代码

modules是另一个界面,看起来像这样:

@JsType 
public interface Modules { 
    @JsFunction 
    @FunctionalInterface 
    interface CallbackRequire { 
     void apply(Module module); 
    } 

    @JsProperty 
    String getBase(); 

    @JsProperty 
    void setBase(String base); 

    void require(JsArrayString modules, CallbackRequire onload); 
} 

我跟着就如何将本文档中迁移的规则: https://docs.google.com/document/d/10fmlEYIHcyead_4R1S5wKGs1t2I7Fnp_PaNaa7XTEk0/edit#

我是不是能解决这个问题。我能得到的最好的结果是将@JsType更改为@JsType(isNative = true)。然后,铸造工作,但另一个错误发生,现在不记得了,但我不知道,如果isNative真的是解决这个问题的正确方法。

+0

你正在使用哪个GWT版本? GWT 2.8-beta?尝试使用'GWT 2.8-rc2'并且正确的'XjsInteropMode JS'标志被重命名为''-generateJsInteropExports' –

+0

我有2.8.0-beta,现在尝试2.8.0-rc2并且想要最终从XjsInteropMode移动,但现在我得到该ClassCastException。由于我使用我的帖子中指定的文档进行迁移,因此我设置了新的标志“-generateJsInteropExports”。用新标志尝试了两个版本,但错误是一样的。 –

+0

你可以更新与确切的例外职位? –

回答

0

将“(isNative = true)”添加到大多数接口后,它都会再次运行。我唯一需要改变的是MODULE_NAME字段,因为它们不能用本地JsType初始化。

+1

'@ JsOverlay'能帮忙吗? –

+0

是的,它可以!谢谢!我认为这只适用于方法。 –