2011-05-25 16 views
7

Soy nuevo en el framework Google Guice y tengo una pregunta sobre la inyección en servlet de guice y el uso de RequestScope. Ok, déjame dar un ejemplo de mi código solo para aclarar las cosas.Guice inject en el servlet

que tienen una clase de frijol, por ejemplo, frijol ..

@RequestScope 
public class Bean { 
    private String user; 
    private String pass; 

    // constructor which is @inject 

    // getters and setters 
} 

Aquí tengo un servlet

@Singleton 
public class MainServlet extends HttpServlet { 
    doGet(HttpServletRequest request, HttpServletResponse response) { 
     .... some code 
     Injector injector = Guice.createInjector(); 
     ValidUser validUser = injector.getInstance(ValidUser.class) 
     // Here i got the below exception 
    } 
} 



com.google.inject.ConfigurationException: Guice configuration errors: 

1) No scope is bound to com.google.inject.servlet.RequestScoped. 
    at Bean.class while locating Bean 

Es interesante aquí que alcance servlet es producto único que sabemos. Y también ¿cómo puedo obtener de la solicitud http - instancia de Bean? porque, por lo que entiendo después de que se inyecta una instancia de una clase Bean, va en la solicitud http, ¿verdad?

Cualquier ayuda o ejemplo es bienvenido. Gracias Br

Respuesta

16

Estás creando y utilizando un Injectordentro el método doGet en su servlet ... que no tiene ninguna posibilidad de ser consciente del alcance o de la solicitud actual o nada!

Guice servlet requiere que configure todas las solicitudes que pasar por el GuiceFilter y que cree una subclase de GuiceServletContextListener que crea el Injector que utilizará toda su aplicación. Todo esto se describe en la guía del usuario de Guice en la sección Servlets.

Una vez que haya hecho eso, puede @Inject cosas en su MainServlet (incluso utilizando un @Inject constructor anotado). Para obtener una instancia con ámbito de solicitud de Bean dentro del servlet, deberá inyectar un Provider<Bean> (ya que Bean tiene un alcance menor que el servlet singleton). Dentro de una solicitud, puede llamar al beanProvider.get() para obtener el Bean para la solicitud actual.

Tenga en cuenta que los servlets son únicos porque así es como funcionan en el mundo servlet de Java normal ... cada uno de ellos se crea solo una vez por aplicación y esa única instancia se usa para todas las solicitudes a ese servlet.

+0

Gracias, creo que lo tengo. :) – brakebg

Cuestiones relacionadas