Frage

Ich habe einige Fragen in Bezug auf GWT-Versand und guice. Ich verwende Guice 2.0, GWT-Versand 1.1.0 Snapshot, MVP4G 1.1.0 und GIN 1.0

Zu allererst habe ich definiert einfache Aktion, Ergebnis und Handler:

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 */
    }

}

In früheren Version meiner App, der RPC-Dienst unter Verwendung anstelle von Befehlsmustern, hatte ich eine Methode, die SqlSessionFactory für Injektionen, so etwas wie diese zur Verfügung stellt:

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

Ich las auf GWT-Versand getting started, dass ich zwischen meinem Handeln und es Handler zur Verfügung stellen muß Bindung, die so ähnlich aussehen:

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

Aber ich habe Problem Verdrahtung alles mit Guice, weil dieses Beispiel von GWT-Versand Website:

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

nicht funktioniert, da es keine DispatchServiceServlet im Paket.

Meine Fragen sind:

  • Wie soll ich schreiben DispatchServletModule und wie man es machen würde (mit dem, was ich Pfad dienen soll)
  • Was soll ich in der Datei web.xml meiner app setzen zu können, richtig Aktionen von meinem Moderator ausführen, der GIN DispatcherAsync Implementierung injiziert hat
  • Wo soll ich meine SqlSessionFactory Methode Bereitstellung setzen (in dem Modul) in der Lage sein SqlSessionFactory zu injizieren, wo ich es brauche
  • Wie ich den Injektor instanziiert so ist, dann kann ich es in anderen Aktionshandler verwenden ordnungsgemäß

Ich denke, das ist alles, und ich mich klar ausgedrückt. Wenn etwas nicht klar genug ist, werde ich versuchen, um genauer zu sein.

Keine korrekte Lösung

Andere Tipps

Haben Sie eine GuiceServletConfig Klasse erstellt? Hier können Sie Ihre Setup-Dispatch-Servlet-Modul sowie Ihr Action-Handler-Modul mit Guice.

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

Die HandlerModule ist Ihre actionhandler Modulklasse, so aus dem Code Sie Ihre ContactModule Klasse setzen würden.

Für Ihre SqlSessionFactory, Sie könnten es die Bindung Setup in Ihrem ContactModule, mit meinem Code ich habe nur einen einzigen server dass Sätze alle meine Service und Action-Handler-Bindungen. Dies ist in erster Linie aus Gründen der Einfachheit.

GWT-Plattform-Framework verwendet eine GWT-Versand Gabel RPC-Anforderungen zu behandeln. Es gibt eine Menge Code, mit dem Sie sich wahrscheinlich musste wtite, wenn Sie ernsthaft mit Dispatcher und Guice denken. Ich kann es sehr empfehlen.

Zum einen sympathisieren ich. Putting dies ist alles in allem nicht in einer Stelle dokumentiert. Ich werde jede Ihrer Fragen der Reihe nach beantworten. Hinzufügen von Kommentaren zu meiner Antwort, wenn irgendetwas davon, ist unklar.

QU: Wie soll ich schreiben DispatchServletModule und wie man es machen würde (mit dem, was ich Pfad dienen soll)

Es gibt eine GuiceStandardDispatchServlet Klasse im net.customware.gwt.dispatch.server.guice Paket; verwende das. Ich bin nicht 100 Prozent sicher, warum, aber der Weg, den ich Gebrauch enthält den Namen meines GWT-Modul, gefolgt von ‚/ Versand‘. Sie könnten damit experimentieren.

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

QU: Was soll ich in der Datei web.xml meiner app setzen zu können, richtig Aktionen von meinem Moderator auszuführen, der GIN injiziert hat DispatcherAsync Implementierung

<?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>

... und dann müssen Sie einen benutzerdefinierten Kontext Zuhörer, die eine Guice Injektor erzeugt wie folgt. Beachten Sie, dass ich Ihre ContactModule aufgenommen haben, die Aktionshandler bindet.

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

QU: Wo soll ich meine SqlSessionFactory Methode Bereitstellung setzen (in dem Modul) in der Lage sein SqlSessionFactory zu injizieren, wo ich es brauche

Beachten Sie, dass ich eine neue SQLStuffModule im vorherigen Codeausschnitt enthalten sind; Das wäre ein guter Ort, um Ihre SqlSessionFactory zu setzen verbindlich. Es gibt keinen Schaden mehrere Module aufweisen, und ich finde, dass es die verschiedenen Anliegen schön getrennt hält.

QU: Wie ich den Injektor instanziiert so ist, dann kann ich es in anderen Aktionshandler verwenden ordnungsgemäß

Für die serverseitige finden Sie in den MyContextListener Codeausschnitt oben.

Auf der Client-Seite, benötigen Sie eine benutzerdefinierte Injektor-Schnittstelle etwas wie folgt aus:

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

... und Sie können Ihre MVP Sachen in einem benutzerdefinierten Gin Modul binden, wie folgt. Es tut mir leid, dass ich mit MVP4G nicht vertraut bin, aber ich nehme an, dass Sie die Ansichten und Moderatoren zusammen in der Modulklasse müssen verdrahten.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top