2016-09-16 99 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

是的,它可以!謝謝!我認爲這隻適用於方法。 –