WedX - журнал о программировании и компьютерных науках

Миграция GWT JsInterop

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

У меня есть интерфейс 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 действительно правильный способ решить эту проблему.

16.09.2016

  • какую версию GWT вы используете? GWT 2.8-бета? Попробуйте использовать GWT 2.8-rc2, а также правильный флаг XjsInteropMode JS был переименован в -generateJsInteropExports 18.09.2016
  • У меня была бета-версия 2.8.0, теперь я попробовал 2.8.0-rc2 и хотел, наконец, перейти от XjsInteropMode, но теперь я получаю исключение ClassCastException. Поскольку для переноса я использовал документ, указанный в моем посте, у меня установлен новый флаг -generateJsInteropExports. Пробовал обе версии с новым флагом, но ошибка та же. 19.09.2016
  • Можете ли вы обновить сообщение с точным исключением? 19.09.2016
  • После добавления (isNative=true) в большинство интерфейсов все снова работает. Единственное, что мне пришлось изменить, это поля MODULE_NAME, так как они не могут быть инициализированы в нативном JsType. Так что, думаю, мне больше не нужна помощь :) спасибо за попытку. 19.09.2016

Ответы:


1

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

25.01.2017
  • Может ли @JsOverlay помочь? 26.01.2017
  • Да мог! Благодарность! Я думал, что это только для методов. 26.01.2017
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]