Guice залить в сервлет - PullRequest
7 голосов
/ 25 мая 2011

Я новичок в каркасе Google Guice, и у меня есть вопрос, касающийся внедрения в сервлет guice и использования RequestScope.Хорошо, позвольте мне привести пример из моего кода, чтобы все было ясно.

У меня есть класс бинов, например, Бин.

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

    // constructor which is @inject 

    // getters and setters
}

Здесь у меня есть сервлет

@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

Интересно, что область действия сервлета, как мы знаем, одиночная.И также, как я могу получить от http-запроса - экземпляр Бина ??потому что, насколько я понимаю, после внедрения экземпляра класса Bean он входит в http-запрос, верно?

Любая помощь или пример приветствуются.Спасибо Br

1 Ответ

16 голосов
/ 25 мая 2011

Вы создаете и используете Injector внутри метод doGet в вашем сервлете ... у него нет шансов узнать объем или текущий запрос или что-нибудь еще!

Guice Servlet требует, чтобы вы настроили все запросы на GuiceFilter и создали подкласс GuiceServletContextListener, который создает Injector, который будет использоваться всем вашим приложением.Все это описано в руководстве пользователя Guice в разделе Servlets .

После того, как вы это сделаете, вы можете @Inject вещи в вашем MainServlet (даже используя @Inject аннотированный конструктор).Чтобы получить экземпляр области действия Bean внутри сервлета, вам нужно ввести Provider<Bean> (так как Bean имеет меньшую область действия, чем одноэлементный сервлет).Внутри запроса вы можете позвонить beanProvider.get(), чтобы получить Bean для текущего запроса.

Обратите внимание, что сервлеты являются синглетонами, потому что так они работают и в обычном мире сервлетов Java ...каждый из них создается только один раз для каждого приложения, и этот единственный экземпляр используется для всех запросов к сервлету.

...