2016-09-16 2 views
0

Ich versuche, von Compiler-Flag -XjsInteropMode JS zu migrieren, aber ich stoße auf ein Problem.GWT JsInterop Migration

Ich habe eine Schnittstelle namens Module die wie folgt aussieht:

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

Dann habe ich eine andere Schnittstelle namens AuthenticationModule, die wie folgt aussieht:

@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); 
} 

Das Modul Interface-Schnittstelle nur ein Marker ist, Wenn ich also ein Modul geladen habe, war ich in der Lage, es am Ende auf ein Modul zu übertragen, das ich wollte, Beispiel hier:

@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 in diesem Code ist eine weitere Schnittstelle, die wie folgt aussieht:

@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); 
} 

ich die Regeln auf, gefolgt wie in diesem Dokument zu migrieren: https://docs.google.com/document/d/10fmlEYIHcyead_4R1S5wKGs1t2I7Fnp_PaNaa7XTEk0/edit#

Ich war nicht in der Lage, dieses Problem zu lösen. Das Beste, was ich bekommen konnte, war @JsType zu @JsType(isNative = true) zu ändern. Dann hat das Casting funktioniert, aber ein weiterer Fehler ist aufgetreten, ich kann mich jetzt nicht erinnern, aber ich bin mir nicht sicher, ob das isNative wirklich der richtige Weg ist, um dieses Problem zu lösen.

+0

Welche GWT-Version verwenden Sie? GWT 2.8-Beta? Versuchen Sie 'GWT 2.8-rc2' zu verwenden und auch das' XjsInteropMode JS' Flag wurde in '-generateJsInteropExports' umbenannt. –

+0

Ich hatte 2.8.0-beta, jetzt versuchte 2.8.0-rc2 und wollte endlich aus dem XjsInteropMode wechseln , aber jetzt bekomme ich diese ClassCastException. Da ich das in meinem Post angegebene Dokument zur Migration verwendet habe, habe ich das neue Flag "-generateJsInteropExports" gesetzt. Versuchte beide Versionen mit der neuen Flagge, aber der Fehler ist der gleiche. –

+0

Können Sie den Beitrag mit der genauen Ausnahme aktualisieren? –

Antwort

0

Nach dem Hinzufügen von "(isNative = true)" zu den meisten Schnittstellen funktioniert alles wieder. Das einzige, was ich ändern musste, waren die MODULE_NAME-Felder, da sie nicht in einem nativen JsType initialisiert werden können.

+1

Hilft '@ JsOverlay'? –

+0

Ja könnte es! Vielen Dank! Ich dachte, es ist nur für Methoden. –