0

gwt-dispatchとguiceに関していくつか質問があります。Guice 2.0、gwt-dispatch 1.1.0スナップショット、mvp4g 1.1.0、およびGIN1.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);
    }
}

しかし、gwt-dispatchサイトからのこの例のため、Guiceですべてを配線するのに問題があります。

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

DispatchServiceServletパッケージにないため、動作しません。

私の質問は次のとおりです。

  • DispatchServletModuleをどのように記述し、どのように実行するか(パスを提供する必要があるものを使用して)
  • GINがDispatcherAsync実装されたプレゼンターからアクションを正しく実行できるようにするには、アプリのweb.xmlファイルに何を入れる必要がありますか
  • SqlSessionFactory必要な場所にSqlSessionFactoryを挿入できるように、提供メソッドをどこに配置する必要がありますか(どのモジュールに)
  • インジェクターをインスタンス化して、他のアクションハンドラーで適切に使用できるようにする方法

それがすべてだと思い、私は自分自身を明確にしました。何かが十分に明確でない場合、私はより具体的にしようとします。

4

3 に答える 3

1

GWT-Platformフレームワークは、gwt-dispatchフォークを使用してrpcリクエストを処理します。ディスパッチャーとGuiceを真剣に使用することを考えると、コードがたくさんあります。私はそれを強くお勧めします。

于 2011-01-19T16:19:31.283 に答える
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 しかありません。これは主に単純化のためです。

于 2010-05-06T00:36:13.543 に答える
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: GIN が DispatcherAsync 実装を注入したプレゼンターからアクションを正しく実行できるようにするには、アプリの web.xml ファイルに何を入力すればよいですか?

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

...そして、次のようにカスタム Gin モジュールに MVP のものをバインドできます。mvp4g に詳しくなくて申し訳ありませんが、モジュール クラスでビューとプレゼンターを結び付ける必要があると思います。

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
于 2011-01-19T18:08:59.353 に答える