Domanda

ho alcune domande riguardanti GWT-spedizione e Guice. Sto utilizzando Guice 2.0, GWT-spedizione 1.1.0 snapshot, mvp4g 1.1.0 e GIN 1.0

Prima di tutto, ho definito semplice azione, risultato e gestore:

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

}

Nella versione precedente della mia app, che stava usando servizio RPC invece di modello di comando, ho avuto un metodo che è stato fornito SqlSessionFactory per preparazioni iniettabili, qualcosa di simile:

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

ho letto su GWT-spedizione iniziare che devo fornire vincolante tra la mia azione e del conduttore, che dovrebbe apparire qualcosa di simile:

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

Ma ho problema di cablaggio tutto con Guice, perché questo esempio dal sito GWT-la spedizione:

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

non funziona, dal momento che non v'è alcun DispatchServiceServlet nel pacchetto.

Le mie domande sono:

  • Come dovrei scrivere DispatchServletModule e come farlo andare (con quello che avrei dovuto servire percorso)
  • cosa devo mettere nel file web.xml della mia app per essere in grado di eseguire correttamente le azioni dalla mia presentatrice, che ha iniettato GIN implementazione DispatcherAsync
  • Dove devo mettere il mio SqlSessionFactory metodo fornisce (in quale modulo) per essere in grado di iniettare SqlSessionFactory dove ho bisogno
  • Come posso creare un'istanza della iniettore così allora posso usarlo in altri gestori di azione correttamente

penso che è tutto e io stato chiaro. Se qualcosa non è abbastanza chiaro, cercherò di essere più specifico.

Nessuna soluzione corretta

Altri suggerimenti

Avete creato una classe GuiceServletConfig? Questo è dove si imposta il modulo servlet spedizione così come il modulo gestore di azione con Guice.

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

Il HandlerModule è la classe del modulo actionHandler, quindi dal codice si dovrebbe mettere la classe ContactModule.

Per la vostra SqlSessionFactory, si potrebbe configurare l'associazione per esso nel vostro ContactModule, con il mio codice ho solo un singolo ServerModule che imposta tutti i miei servizi e gestore di azione associazioni. Ciò è principalmente per ragioni di semplicità.

framework GWT-piattaforma utilizza una forcella GWT-spedizione per gestire le richieste RPC. C'è un sacco di codice, che probabilmente si doveva wtite te stesso, se si pensa di utilizzare seriamente dispatcher e Guice. Lo consiglio vivamente.

In primo luogo, simpatizzo. Mettendo insieme tutto questo non è documentato in un solo posto. Risponderò ciascuna delle vostre domande, a sua volta. Aggiungere commenti alla mia risposta, se niente di tutto ciò è chiaro.

QU:? Come dovrei scrivere DispatchServletModule e come farlo andare (con quello che avrei dovuto servire percorso)

C'è una classe GuiceStandardDispatchServlet nel pacchetto net.customware.gwt.dispatch.server.guice; usare quella. Io non sono al 100 per cento sicuro perché, ma l'uso percorso che include il nome del mio modulo GWT, seguito da '/ spedizione'. Potrebbe essere necessario sperimentare con questo.

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

QU: cosa devo mettere nel file web.xml della mia app per essere in grado di eseguire correttamente le azioni dalla mia presentatrice, che ha iniettato GIN DispatcherAsync realizzazione

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

... e quindi avrete bisogno di un ascoltatore contesto personalizzato che crea un iniettore Guice come segue. Si noti che ho incluso la tua ContactModule, che lega i gestori di azione.

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

QU:? Dove devo mettere il mio SqlSessionFactory fornendo il metodo (nel quale modulo) per essere in grado di iniettare SqlSessionFactory dove ho bisogno

Si noti che ho inserito un nuovo SQLStuffModule nel precedente frammento di codice; che sarebbe un buon posto per mettere il vostro legame SqlSessionFactory. Non c'è nulla di male avere più moduli, e trovo che mantiene le varie preoccupazioni ben separati.

QU:? Come creare un'istanza della iniettore così allora posso usarlo in altri gestori di azione correttamente

Per il lato server, vedere il codice MyContextListener frammento di codice.

Sul lato client, avrete bisogno di un qualcosa di un'interfaccia iniettore personalizzato come questo:

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

... e si può legare la tua roba MVP in un modulo personalizzato Gin come segue. Mi dispiace che io non sono a conoscenza mvp4g, ma suppongo che sarà necessario collegare i punti di vista e presentatori insieme nella classe del modulo.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top