GWT-DispatchとGuiceおよびMVP4Gを接続します
-
03-10-2019 - |
質問
GWT-DispatchとGuiceに関していくつか質問があります。 Guice 2.0、GWT-Dispatch 1.1.0 Snapshot、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);
}
}
しかし、GWT-Dispatchサイトからのこの例は、GUICEですべての配線を行うのに問題があります。
public class DispatchServletModule extends ServletModule {
@Override
public void configureServlets() {
serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
}
}
noがあるので、動作しません DispatchServiceServlet
パッケージで。
私の質問は次のとおりです。
- DispatchServletModuleとそれをどのように進めるかをどのように書く必要がありますか(私がパスに仕えるべきもので)
- 私のアプリのweb.xmlファイルに何を入れて、ジンが注入したプレゼンターからアクションを正しく実行できるようにする必要があります
DispatcherAsync
実装 - どこに置くべきですか
SqlSessionFactory
SQLSessionFactoryが必要な場所に注入できるようにする方法(モジュール)を提供する - インジェクターをインスタンス化する方法で、他のアクションハンドラーで適切に使用できるようにします
それがすべてだと思います、そして私は自分自身を明らかにしました。何かが十分に明確でない場合は、より具体的にするようにします。
正しい解決策はありません
他のヒント
GuiceservletConfigクラスを作成しましたか?これは、Dispatch Servletモジュールと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フォークを使用してRPC要求を処理します。 DispatcherとGuiceを真剣に使用していると考えている場合、おそらく自分自身をWtiteしなければならなかったコードがたくさんあります。強くお勧めします。
まず、私は同情します。これをすべてまとめることは、どの場所にも文書化されていません。私はあなたの質問のそれぞれに順番に答えます。そのいずれかが不明である場合は、私の答えにコメントを追加してください。
QU:DispatchServletModuleとそれをどのように作成するか(パスにサービスを提供する必要がある)をどのように書く必要がありますか?
net.customware.gwt.dispatch.server.guiceパッケージには、guicestanddispatchservletクラスがあります。それを使用してください。理由は100%確信していませんが、使用するパスにはGWTモジュールの名前が含まれ、その後に「/ディスパッチ」が含まれています。あなたはそれを試す必要があるかもしれません。
public class MyServletModule extends ServletModule {
@Override protected void configureServlets() {
serve("/com.my.module.name/dispatch")
.with(GuiceStandardDispatchServlet.class);
}
}
QU: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 Injectorを作成するカスタムコンテキストリスナーが必要です。アクションハンドラーにバインドする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のものをカスタムジンモジュールにバインドできます。 MVP4Gに精通していないことを申し訳ありませんが、モジュールクラスでビューとプレゼンターを一緒に配線する必要があると思います。
public class MyClientModule extends AbstractGinModule {
@Override protected void configure() {
bind(...).to(...);
...
}
}