Состояние сеанса с использованием guice - PullRequest
3 голосов
/ 23 февраля 2011

У меня есть некоторое состояние области сеанса.Первой идеей было провести сервлеты в сессионной области.Поэтому я привязываю свой сервлет следующим образом

bind(Foo.class).in(ServletScopes.SESSION);

Но я получаю исключение

javax.servlet.ServletException: сервлеты должны быть связаны как одиночные.Ключ [type = Foo, annotation = [none]] не был связан в одноэлементной области.

Значит, сервлеты не могут иметь область действия от ServletScopes?Как правильно обращаться с состоянием сеанса (да, конечно, лучше писать состояние без сервлетов / классов / приложений)?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Насколько я понимаю, вы можете связать все, что хотите, с областью сеанса, проблема в том, что в вашем примере Foo кажется подклассом Servlet, и сервлеты должны быть связаны в Singleton сфера.

Чтобы решить эту проблему, просто свяжите ваше состояние (называемое Bar) в области видимости сеанса и дайте вашему конструктору Foo аргумент Provider<Bar> (который будет заполнен Guice), чтобы вы могли получить доступ к состоянию области сеанса из сервлета Foo синглтона.

2 голосов
/ 23 февраля 2011

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

Поэтому связывать их с областью действия сеанса не имеет смысла: Guice не может создать один отдельный экземпляр сервлета для сеанса.

Сервлет всегда должен быть без сохранения состояния (т. Е. Его состояние должно быть глобальным для всех клиентови быть доступным потокобезопасным способом)

...