Проблемы с EventBus и Gin в Gwt 2.4

Я пытаюсь использовать Gin в MVP GWT 2.4. В моем модуле у меня есть:

import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.SimpleEventBus;

    @Override
      protected void configure() {
        bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
        ...
      }

В приведенном выше коде используется новый com.google.web.bindery.event.shared.EventBus. Проблема возникает, когда я хочу внедрить шину событий в действия MVP, которые реализуют Activity:

package com.google.gwt.activity.shared;

import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;

public interface Activity {

  ...

  void start(AcceptsOneWidget panel, EventBus eventBus);
}

Activity использует устаревший com.google.gwt.event.shared.EventBus. Как я могу примирить их? Очевидно, что если я запрошу устаревший тип EventBus, тогда Gin пожалуется, потому что я не указал для него привязку.

Обновление: это позволит приложению построить, но теперь есть два разных EventBus, что ужасно:

 protected void configure() {
    bind(com.google.gwt.event.shared.EventBus.class).to(
        com.google.gwt.event.shared.SimpleEventBus.class).in(Singleton.class);
    bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
    ...

person Nick Heiner    schedule 13.02.2012    source источник
comment
Один из приемов - просто использовать устаревшую версию повсюду в моем коде. Насколько плохо это делать?   -  person Nick Heiner    schedule 14.02.2012


Ответы (4)


Для этого зарегистрирована текущая проблема: http://code.google.com/p/google-web-toolkit/issues/detail?id=6653

Предлагаемый обходной путь, к сожалению, заключается в том, чтобы пока просто придерживаться устаревшего EventBus в вашем коде.

person Strelok    schedule 13.02.2012

Я задал аналогичный вопрос: Какую шину событий GWT мне следует использовать?

Вам не нужна устаревшая шина событий, поскольку она расширяет шину WebBindery.

Создайте базовое Activity, которое все ваши действия расширяют с помощью этого кода:

// Forward to the web.bindery EventBus instead
@Override
@Deprecated
public void start(AcceptsOneWidget panel, com.google.gwt.event.shared.EventBus eventBus) {
   start(panel, (EventBus)eventBus);
}

public abstract void start(AcceptsOneWidget panel, EventBus eventBus);
person checketts    schedule 14.02.2012

Я думаю, что более чистое решение таково:

public class GinClientModule extends AbstractGinModule {

    @Override
    protected void configure() {
        bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
        ...
    }

    @Provides
    @Singleton
    public com.google.gwt.event.shared.EventBus adjustEventBus(
            EventBus busBindery) {
        return (com.google.gwt.event.shared.EventBus) busBindery;
    }

...

См. Мой ответ здесь

person Christian Achilli    schedule 06.06.2013

Я обнаружил, что привязка как новой, так и старой версии к одному и тому же экземпляру помогает.

    /*
     * bind both versions of EventBus to the same single instance of the
     * SimpleEventBus
     */
    bind(SimpleEventBus.class).in(Singleton.class);
    bind(EventBus.class).to(SimpleEventBus.class);
    bind(com.google.gwt.event.shared.EventBus.class).to(SimpleEventBus.class);

Теперь, когда вашему коду требуется EventBus, вставьте тот, который требуется для кода, и избегайте предупреждений об устаревании.

person pillingworth    schedule 30.01.2013