Anschließen gwt-Versand mit guice und MVP4G
-
03-10-2019 - |
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(...);
...
}
}