2011-02-23 52 views
3

我有一些會話作用域狀態。首先想到的是會話範圍的servlet。所以,我結合我的servlet這樣使用guice的會話狀態

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

但我得到一個異常

javax.servlet.ServletException:Servlet的必須綁定爲單身。 Key [type = Foo,annotation = [none]]未在單例作用域中綁定。

那麼servlet不能從ServletScopes範圍?什麼是處理會話狀態的正確方法(是的,當然最好是編寫更少的狀態servlet /類/應用程序)?

回答

3

從我的理解,你可以綁定任何你想要的會話範圍,問題是在你的例子中Foo似乎是Servlet的一個子類,而Servlets必須綁定在Singleton範圍內。

要解決此問題,只需綁定你狀態(稱爲Bar)session範圍內,給你Foo構造一個Provider<Bar>參數(這將在由吉斯填寫),所以你可以從單訪問會話範圍的狀態-scoped Foo Servlet。

+0

非常感謝。這是我需要的。 – 2011-02-23 13:47:30

2

servlets不是由Guice創建的,而是由servlet容器創建的。它們是單例:servlet容器只創建一個實例來服務所有客戶端的所有請求。

因此,將它們綁定到會話範圍是沒有意義的:Guice不能爲每個會話創建一個不同的servlet實例。

一個servlet應始終是無狀態(即其狀態應該是全球所有客戶端,並且在一個線程安全的方式訪問)

+0

好的。謝謝。但爲什麼ServletScopes的創建目的?而我應該把我的會話範圍變量? – 2011-02-23 13:41:23

+1

當你使用guice-servlet擴展時,Guice確實創建了servlet。它要求servlet是單例,因爲它符合servlet規範。 – ColinD 2011-02-23 22:02:51