3

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

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

但我得到一个例外

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

所以 servlet 不能从 ServletScopes 获得作用域?处理会话状态的正确方法是什么(是的,当然最好编写无状态的 servlet/类/应用程序)?

4

2 回答 2

3

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

要解决这个问题,只需在会话范围内绑定您的状态(称为)并为您的构造函数提供一个参数(将由 Guice 填充),以便您可以从单例范围的Servlet 访问会话范围的状态。BarFooProvider<Bar>Foo

于 2011-02-23T13:39:49.740 回答
2

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

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

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

于 2011-02-23T13:38:02.997 回答