2010-05-05 2 views
0

У меня есть вопросы относительно gwt-dispatch и guice. Я использую Guice 2.0, GWT-диспетчерская 1.1.0 снимок, mvp4g 1.1.0 и джин 1,0Подключение gwt-dispatch с направляющими и mvp4g

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

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-отправке при получении начал, что я должен обеспечить связывание между моим действием, и это обработчик, который должен выглядеть примерно так:

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

Но у меня есть проблемы с проводкой все это с Guice, потому что этот пример из GWT-диспетчерский сайте:

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

не работает, т.к. DispatchServiceServlet в пакете.

Мои вопросы:

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

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

+0

Похоже, что на стороне сервера работает, но на стороне клиента mu нет. У меня есть Ginjector с моим модулем, предоставляющим Mvp4g и стандартный модуль gwt-dispatch, обеспечивающий реализацию DispatchAsync. Но похоже, что инжектор вводит нулевой экземпляр, так как я получаю null, у меня нет свойств в моем отладке firebug. И когда я отключу фрагмент кода, который использует диспетчер, приложения работают:/Я не знаю, как это решить. – jjczopek

ответ

1

Вы создали класс 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, который устанавливает все привязки обработчика сервиса и действия. Это в основном ради простоты.

1

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

1

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

QU: Как я должен писать 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); 
    } 
} 

QU: что я должен поместить в файл web.xml мое приложение, чтобы иметь возможность правильно выполнять действия от моего ведущего, который GIN впрыскивается реализацию DispatcherAsync?

<?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()); 
    } 
} 

QU: Где я должен поместить мой SqlSessionFactory метод обеспечения (в котором модуль), чтобы иметь возможность вводить SqlSessionFactory, где мне это нужно?

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

QU: Как я создаю инжектор, чтобы потом использовать его в других обработчиках?

Для серверной части см. Фрагмент кода 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(...); 
    ... 
    } 
} 
Смежные вопросы