Question

J'ai quelques questions concernant GWT-expédition et Guice. J'utilise Guice 2.0, instantané GWT-expédition 1.1.0, 1.1.0 et mvp4g GIN 1.0

D'abord, je l'ai défini une action simple, résultat et gestionnaire:

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

}

Dans la version précédente de mon application, qui utilisait le service rpc au lieu de modèle de commande, j'avais une méthode qui fournissait SqlSessionFactory pour préparations injectables, quelque chose comme ceci:

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

Je lis sur GWT-expédition commencer que je dois fournir une liaison entre mon action et gestionnaire de ce qui devrait ressembler à quelque chose comme ça:

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

Mais j'ai un problème de câblage tout cela avec Guice, parce que cet exemple à partir du site GWT-expédition:

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

ne fonctionne pas, car il n'y a pas DispatchServiceServlet dans le paquet.

Mes questions sont les suivantes:

  • Comment dois-je écrire DispatchServletModule et comment faire passer (avec ce que je dois servir chemin)
  • Que dois-je mettre dans le fichier web.xml de mon application pour être en mesure d'exécuter correctement les actions de mon présentateur, qui a injecté GIN la mise en œuvre de DispatcherAsync
  • Où dois-je utiliser ma méthode fournit SqlSessionFactory (dans lequel module) pour être en mesure d'injecter SqlSessionFactory où je besoin
  • Comment j'instancier l'injecteur donc alors je peux l'utiliser dans d'autres gestionnaires d'action correctement

Je pense que tout est et je me suis fait clair. Si quelque chose ne suffit pas clair, je vais essayer d'être plus précis.

Pas de solution correcte

Autres conseils

Avez-vous créé une classe GuiceServletConfig? C'est là que vous configurez votre module de servlet Dispatch ainsi que votre module de gestionnaire d'action avec Guice.

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

Le HandlerModule est votre classe de module actionHandler, donc de votre code, vous mettriez votre classe ContactModule.

Pour votre SqlSessionFactory, vous pouvez configurer la liaison pour elle dans votre ContactModule, avec mon code que j'ai qu'un seul servermodule qui met en place toutes mes liaisons de service et gestionnaire d'action. Ceci est principalement pour des raisons de simplicité.

Cadre GWT-plate-forme utilise une fourchette GWT-Dispatch pour traiter les demandes rpc. Il y a beaucoup de code, que vous aviez probablement vous wtite, si vous pensez sérieusement d'utiliser le répartiteur et Guice. Je le recommande fortement.

Tout d'abord, je sympathise. Mettre tout cela ensemble est pas documenté dans un endroit donné. Je vais répondre à chacune de vos questions à tour de rôle. Ajouter des commentaires à ma réponse si l'un de on ne sait pas.

QU: Comment dois-je écrire DispatchServletModule et comment faire passer (avec ce que je dois servir chemin)

Il y a une classe GuiceStandardDispatchServlet dans le package net.customware.gwt.dispatch.server.guice; Utiliser ça. Je ne suis pas 100 pour cent sûr pourquoi, mais l'utilisation de chemin I comprend le nom de mon module GWT, suivi de « / expédition ». Vous pourriez avoir à expérimenter avec cela.

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

QU: que dois-je mettre dans le fichier web.xml de mon application pour être en mesure d'exécuter correctement les actions de mon présentateur, qui a injecté GIN mise en œuvre DispatcherAsync

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

... et alors vous aurez besoin d'un écouteur de contexte personnalisé qui crée un injecteur Guice comme suit. Notez que j'ai inclus votre ContactModule, qui lie les gestionnaires d'action.

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

QU: Où dois-je utiliser ma méthode fournissant SqlSessionFactory (dans lequel module) pour être en mesure d'injecter SqlSessionFactory où je besoin

Notez que j'ai inclus une nouvelle SQLStuffModule dans l'extrait de code précédent; ce serait un bon endroit pour mettre votre SqlSessionFactory obligatoire. Il n'y a pas de mal d'avoir plusieurs modules, et je trouve qu'il conserve les diverses préoccupations bien séparés.

QU: Comment j'instancier l'injecteur donc alors je peux l'utiliser dans d'autres gestionnaires d'action correctement

Pour le côté serveur, voir l'extrait de code MyContextListener ci-dessus.

Du côté client, vous aurez besoin d'un quelque chose comme interface d'injecteur personnalisé ceci:

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

... et vous pouvez lier vos trucs de MVP dans un module de Gin personnalisé comme suit. Je suis désolé que je ne suis pas familier avec mvp4g, mais je suppose que vous aurez besoin de câbler les vues et les présentateurs ensemble dans la classe du module.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top