【问题标题】:Connecting gwt-dispatch with guice and mvp4g用 guice 和 mvp4g 连接 gwt-dispatch
【发布时间】:2011-02-16 03:08:30
【问题描述】:

我有一些关于 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
  • 我如何实例化注入器,以便可以在其他操作处理程序中正确使用它

我认为仅此而已,我已明确表示。如果有些地方不够清楚,我会尝试更具体。

【问题讨论】:

  • 看起来服务器端可以工作,但 mu 客户端不能。我有一个 Ginjector,我的模块提供 Mvp4g 和提供 DispatchAsync 实现的标准 gwt-dispatch 模块。但看起来注入器注入了一个空实例,因为我得到的空值在我的萤火虫调试中没有任何属性。当我禁用使用调度程序的代码片段时,应用程序可以工作:/我不知道如何解决这个问题。

标签: gwt inversion-of-control gwt-gin gwt-dispatch gwt-mvp


【解决方案1】:

首先,我很同情。将所有这些放在一起并没有记录在任何地方。我会依次回答你的每一个问题。如果有任何不清楚的地方,请将 cmets 添加到我的答案中。

问:我应该如何编写 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 文件中添加什么内容才能正确执行来自我的演示者的操作,该演示者已经注入了 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 注入我需要的地方?

请注意,我在之前的代码 sn-p 中包含了一个新的 SQLStuffModule;那将是放置 SqlSessionFactory 绑定的好地方。拥有多个模块并没有什么坏处,而且我发现它可以很好地分离各种关注点。

QU:我如何实例化注入器以便可以在其他操作处理程序中正确使用它?

服务器端见上面的MyContextListener代码sn-p。

在客户端,您需要一个像这样的自定义注入器接口:

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

【讨论】:

    【解决方案2】:

    GWT-Platform 框架使用 gwt-dispatch fork 来处理 rpc 请求。如果您考虑认真使用调度程序和 Guice,那么您可能不得不自己编写大量代码。我强烈推荐它。

    【讨论】:

      【解决方案3】:

      您是否创建了 GuiceServletConfig 类?这是您使用 Guice 设置 Dispatch servlet 模块以及动作处理程序模块的地方。

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

      HandlerModule 是您的 ActionHandler 模块类,因此您可以从您的代码中放入您的 ContactModule 类。

      对于您的 SqlSessionFactory,您可以在 ContactModule 中为其设置绑定,使用我的代码我只有一个 ServerModule 来设置我的所有服务和操作处理程序绑定。这主要是为了简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2011-10-04
        相关资源
        最近更新 更多