会话状态使用guice

时间:2011-02-23 13:15:05

标签: java guice guice-servlet

我有一些会话作用域状态。持有它的第一个想法是会话范围的servlet。所以我像这样绑定我的servlet

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

但我得到了一个例外

  
    

javax.servlet.ServletException:Servlet必须绑定为单例。键[type = Foo,annotation = [none]]未绑定在单例范围内。

  

所以servlet不能拥有ServletScopes的作用域?什么是处理会话状态的正确方法(是的,当然最好写一个较少的servlet / classes /应用程序)?

2 个答案:

答案 0 :(得分:3)

根据我的理解,你可以将你想要的任何内容绑定到会话范围,问题是在你的示例中Foo似乎是Servlet和Servlets的子类必须绑定在Singleton范围内。

要解决此问题,只需在会话范围内绑定状态(称为Bar),并为Foo构造函数提供Provider<Bar>参数(将填充此参数) in Guice)所以你可以从单例范围的Foo Servlet访问会话范围的状态。

答案 1 :(得分:2)

servlet不是由Guice创建的,而是由servlet容器创建的。它们是单例:servlet容器只创建一个实例来处理所有客户端的所有请求。

因此将它们绑定到会话范围是没有意义的:Guice不能为每个会话创建一个不同的servlet实例。

servlet应该始终是无状态的(即它的状态应该是所有客户端的全局状态,并以线程安全的方式访问)