【问题标题】:Session state using guice使用 guice 的会话状态
【发布时间】:2011-07-02 18:14:42
【问题描述】:

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

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

但我得到一个例外

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

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

【问题讨论】:

    标签: java guice guice-servlet


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。这是我需要的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 好的。谢谢。但是创建 ServletScopes 的目的是什么?我应该把我的会话范围变量放在哪里?
    • 当您使用 guice-servlet 扩展时,Guice 实际上会创建 servlet。它要求 servlet 是单例的,因为它符合 servlet 规范。
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 2013-08-02
    • 2012-12-24
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2012-02-06
    相关资源
    最近更新 更多