2016-09-16 1 views
0

Я пытаюсь перейти от использования флага компилятора -XjsInteropMode JS, но у меня возникает проблема.GWT JsInterop migration

У меня есть интерфейс, который называется 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-бета? Попытайтесь использовать 'GWT 2.8-rc2', а также правильный флаг' XjsInteropMode JS' был переименован в '-generateJsInteropExports' –

+0

У меня была 2.8.0-бета, теперь попробовала 2.8.0-rc2 и захотелось наконец перейти от XjsInteropMode , но теперь я получаю это ClassCastException. Поскольку я использовал документ, указанный в моем сообщении для переноса, у меня установлен новый флаг «-generateJsInteropExports». Пробовал обе версии с новым флагом, но ошибка одна и та же. –

+0

Можете ли вы обновить сообщение с точным Исключением? –

ответ

0

После добавления «(isNative = true)» к большинству интерфейсов все работает снова. Единственное, что мне нужно было изменить, это поля MODULE_NAME, так как они не могут быть инициализированы в родном JsType.

+1

Может ли '@ JsOverlay' помочь? –

+0

Да, возможно! благодаря! Я думал, что это только для методов. –