我有一些会话作用域状态。持有它的第一个想法是会话范围的servlet。所以我像这样绑定我的servlet
bind(Foo.class).in(ServletScopes.SESSION);
但我得到了一个例外
javax.servlet.ServletException:Servlet必须绑定为单例。键[type = Foo,annotation = [none]]未绑定在单例范围内。
所以servlet不能拥有ServletScopes的作用域?什么是处理会话状态的正确方法(是的,当然最好写一个较少的servlet / classes /应用程序)?
答案 0 :(得分:3)
根据我的理解,你可以将你想要的任何内容绑定到会话范围,问题是在你的示例中Foo
似乎是Servlet
和Servlets的子类必须绑定在Singleton
范围内。
要解决此问题,只需在会话范围内绑定状态(称为Bar
),并为Foo
构造函数提供Provider<Bar>
参数(将填充此参数) in Guice)所以你可以从单例范围的Foo
Servlet访问会话范围的状态。
答案 1 :(得分:2)
servlet不是由Guice创建的,而是由servlet容器创建的。它们是单例:servlet容器只创建一个实例来处理所有客户端的所有请求。
因此将它们绑定到会话范围是没有意义的:Guice不能为每个会话创建一个不同的servlet实例。
servlet应该始终是无状态的(即它的状态应该是所有客户端的全局状态,并以线程安全的方式访问)