Соединение gwt-dispatch с guice и mvp4g - PullRequest
0 голосов
/ 06 мая 2010

У меня есть несколько вопросов, касающихся gwt-dispatch и guice. Я использую Guice 2.0, снимок gwt-dispatch 1.1.0, mvp4g 1.1.0 и GIN 1.0

Прежде всего, я определил простое действие, результат и обработчик:

ListContactsAction.java

public class ListContactsAction implements Action<ListContactsResult>{

    public ListContactsAction() {
    }

}

ListContactsResult.java

public class ListContactsResult implements Result {

    private List<Contact> contactList;

    public ListContactsResult() {
    }

    public ListContactsResult(List<Contact> contactList) {
        this.contactList = contactList;
    }

    public List<Contact> getContactList() {
        return contactList;
    }
}

ListContactsHandler.java

public class ListContactsHandler implements ActionHandler<ListContactsAction, ListContactsResult>{

    @Inject
    private SqlSessionFactory factory;

    public Class<ListContactsAction> getActionType() {
        return ListContactsAction.class;
    }

    public ListContactsResult execute(ListContactsAction a, ExecutionContext ec) throws DispatchException {
        // some code using SqlSessionFactory and returning ListContactResult
        // with list of contacts
    }

    public void rollback(ListContactsAction a, ListContactsResult r, ExecutionContext ec) throws DispatchException {
        /* get action - no rollback needed */
    }

}

В предыдущей версии моего приложения, которая использовала службу rpc вместо шаблона команды, у меня был метод, который предоставлял SqlSessionFactory для инъекций, что-то вроде этого:

@Provides
    public SqlSessionFactory getSqlSessionFactory(){
        // some code here
    }

Я прочитал в начале работы с gwt-dispatch, что должен обеспечить связывание между моим действием и его обработчиком, которое должно выглядеть примерно так:

public class ContactModule extends ActionHandlerModule{
    @Override
    protected void configureHandlers() {
        bindHandler(ListContactsAction.class, ListContactsHandler.class);
    }
}

Но у меня проблема со связью всего этого с Guice, потому что этот пример с сайта gwt-dispatch:

public class DispatchServletModule extends ServletModule {
    @Override
    public void configureServlets() {
        serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
    }
}

не работает, поскольку в пакете нет DispatchServiceServlet.

Мои вопросы:

  • Как мне написать DispatchServletModule и как заставить его работать (с тем, что я должен обслуживать путь)
  • что я должен поместить в файл web.xml моего приложения, чтобы иметь возможность корректно выполнять действия моего докладчика, в который вставлен GIN DispatcherAsync реализация
  • Где я должен поместить свой SqlSessionFactory метод предоставления (в каком модуле), чтобы иметь возможность внедрять SqlSessionFactory туда, где он мне нужен
  • Как я создаю экземпляр инжектора, чтобы затем правильно использовать его в других обработчиках действий

Я думаю, это все, и я прояснил себя. Если что-то не совсем понятно, я постараюсь быть более конкретным.

Ответы [ 3 ]

1 голос
/ 19 января 2011

Платформа GWT-Platform использует форк gwt-dispatch для обработки запросов rpc. Существует много кода, который вам, вероятно, пришлось бы придумать, если вы серьезно думаете об использовании диспетчера и Guice. Я настоятельно рекомендую это.

1 голос
/ 19 января 2011

Во-первых, я сочувствую. Соединение всего этого не задокументировано ни в одном месте. Я отвечу на каждый ваш вопрос по очереди. Добавьте комментарии к моему ответу, если что-то неясно.

ВОПРОС: Как мне написать DispatchServletModule и как заставить его работать (с тем, что я должен обслуживать путь)?

В пакете net.customware.gwt.dispatch.server.guice имеется класс GuiceStandardDispatchServlet; используйте это. Я не уверен на 100%, почему, но путь, который я использую, включает имя моего модуля GWT, за которым следует «/ dispatch». Возможно, вам придется поэкспериментировать с этим.

public class MyServletModule extends ServletModule {
  @Override protected void configureServlets() {
    serve("/com.my.module.name/dispatch")
      .with(GuiceStandardDispatchServlet.class);
  }
}

ВОПРОС: что я должен поместить в файл web.xml моего приложения, чтобы иметь возможность корректно выполнять действия с моим докладчиком, в котором реализована реализация DispatcherAsync с использованием GIN? <?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <filter-mapping> <filter-name>guiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>com.myapp.whatever.MyContextListener</listener-class> </listener> ... </web-app> ... и тогда вам потребуется пользовательский прослушиватель контекста, который создает инжектор Guice следующим образом. Обратите внимание, что я включил ваш ContactModule, который связывает обработчики действий.

public class MyContextListener extends GuiceServletContextListener {
  @Override protected Injector getInjector() {
    return Guice.createInjector(new MyServletModule(), 
      new ContactModule(), new SQLStuffModule());
  }
}

ВОПРОС: Куда мне поместить метод обеспечения SqlSessionFactory (в каком модуле), чтобы можно было внедрять SqlSessionFactory там, где он мне нужен? Обратите внимание, что я включил новый SQLStuffModule в предыдущий фрагмент кода; это было бы хорошим местом для размещения вашей привязки SqlSessionFactory. Нет ничего плохого в том, чтобы иметь несколько модулей, и я обнаружил, что они прекрасно разделяют различные проблемы.

ВОПРОС: Как создать экземпляр инжектора, чтобы можно было правильно использовать его в других обработчиках действий?

Со стороны сервера см. Фрагмент кода MyContextListener выше.

На стороне клиента вам понадобится пользовательский интерфейс инжектора, примерно такой:

@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
  MyWidgetMainPanel getMainPanel();
}

... и вы можете связать свои MVP-компоненты в пользовательском модуле Gin следующим образом. Мне жаль, что я не знаком с mvp4g, но я предполагаю, что вам нужно соединить представления и докладчиков вместе в классе модуля.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
1 голос
/ 06 мая 2010

Вы создали класс GuiceServletConfig? Здесь вы настраиваете свой модуль сервлета Dispatch, а также свой модуль обработчика действий с Guice.

plubic class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
    }
}

HandlerModule - это ваш класс модуля ActionHandler, поэтому из вашего кода вы поместите свой класс ContactModule.

Для вашей SqlSessionFactory вы можете установить привязку для нее в вашем ContactModule, с моим кодом у меня есть только один ServerModule, который устанавливает все привязки моего сервиса и обработчика действий. Это в основном ради простоты.

...