Pregunta

Tengo algunas preguntas con respecto a GWT-despacho y guice. Estoy usando Guice 2,0, gwt-despacho 1.1.0 instantánea, mvp4g 1.1.0 y GIN 1.0

simple acción En primer lugar, he definido, resultado y manipulador:

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

}

En la versión anterior de mi aplicación, que estaba usando el servicio RPC en lugar del patrón de comando, que tenía un método que estaba proporcionando SqlSessionFactory para inyecciones, algo como esto:

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

He leído en GWT-despacho para empezar que tengo para proporcionar la unión entre mi acción y de manipulador, que debe ser algo como lo siguiente:

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

Pero he problema de cableado todo con Guice, porque este ejemplo desde el sitio GWT-despacho:

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

no funciona, ya que no hay DispatchServiceServlet en el paquete.

Mis preguntas son:

  • ¿Cómo debo escribir DispatchServletModule y cómo hacer que ir (con lo que debería servir de ruta)
  • ¿Qué debo poner en el archivo web.xml de mi aplicación para poder ejecutar correctamente las acciones de mi presentadora, que tiene GIN inyecta aplicación DispatcherAsync
  • ¿Dónde debo poner mi SqlSessionFactory proporcionando método (en el que el módulo) para poder inyectar SqlSessionFactory donde lo necesito
  • ¿Cómo crear una instancia del inyector es así, que se puede utilizar en otros controladores de acciones correctamente

creo que eso es todo y que había sido claro. Si algo no es lo suficientemente claro, voy a tratar de ser más específico.

No hay solución correcta

Otros consejos

¿Ha creado una clase GuiceServletConfig? Aquí es donde puede configurar su módulo de servlet de Despacho, así como su acción módulo controlador con Guice.

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

El HandlerModule es su módulo de clase ActionHandler, por lo que a partir del código que le ponga su clase ContactModule.

Para su SqlSessionFactory, se podría configurar el enlace para que en su ContactModule, con mi código sólo tengo una sola servermodule que pone en marcha todos mis servicios y gestor de acción fijaciones. Esto se debe principalmente por el bien de la simplicidad.

marco GWT-plataforma utiliza un tenedor gwt-despacho para manejar solicitudes de RPC. Hay una gran cantidad de código, que es probable que tuviera que wtite ti mismo, si se piensa en serio el uso de despachador y Guice. Yo altamente recomiendo.

En primer lugar, simpatizo. Poniendo todo esto junto no está documentado en ningún punto. Voy a responder a cada una de sus preguntas en turno. Añadir comentarios a mi respuesta si nada de eso está claro.

QU:? ¿Cómo debo escribir DispatchServletModule y cómo hacer que ir (con lo que debería servir de ruta)

Hay una clase GuiceStandardDispatchServlet en el paquete net.customware.gwt.dispatch.server.guice; usa eso. No estoy 100 por ciento seguro por qué, pero el uso ruta I incluye el nombre de mi módulo de GWT, seguido de '/ expedición'. Puede que tenga que experimentar con eso.

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

QU: ¿qué debo poner en el archivo web.xml de mi aplicación para poder ejecutar correctamente las acciones de mi presentadora, que tiene GIN inyectada DispatcherAsync aplicación

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

... y entonces se necesita un oyente contexto personalizado que crea un inyector de Guice de la siguiente manera. Tenga en cuenta que he incluido su ContactModule, que se une controladores de acciones.

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

QU:? ¿Dónde debo poner mi SqlSessionFactory proporcionar método (en el que el módulo) para poder inyectar SqlSessionFactory donde lo necesito

Tenga en cuenta que he incluido un nuevo SQLStuffModule en el fragmento de código anterior; eso sería un lugar bueno para poner su unión SqlSessionFactory. No hay ningún mal tener múltiples módulos, y encuentro que mantiene las diversas preocupaciones separadas correctamente.

QU:? Cómo crear una instancia del inyector es así, que se puede utilizar en otros controladores de acciones correctamente

En el lado del servidor, ver el fragmento de código MyContextListener anteriormente.

En el lado del cliente, tendrá una interfaz personalizada inyector algo como esto:

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

... y puede enlazar sus cosas MVP en un módulo Gin encargo de la siguiente manera. Lo siento que no estoy familiarizado con mvp4g, pero supongo que tendrá que conectar los puntos de vista y presentadores juntos en la clase del módulo.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top