Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用guice的会话状态_Java_Guice_Guice Servlet - Fatal编程技术网

Java 使用guice的会话状态

Java 使用guice的会话状态,java,guice,guice-servlet,Java,Guice,Guice Servlet,我有一些会话作用域状态。举行它的第一个想法是会话范围的servlet。所以我像这样绑定我的servlet bind(Foo.class).in(ServletScopes.SESSION); 但我有个例外 javax.servlet.ServletException:servlet必须绑定为单例。键[type=Foo,annotation=[none]]未绑定在singleton作用域中 所以servlets不能从ServletScopes获得作用域?处理会话状态的正确方法是什么(是的,当然最

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

bind(Foo.class).in(ServletScopes.SESSION);
但我有个例外

javax.servlet.ServletException:servlet必须绑定为单例。键[type=Foo,annotation=[none]]未绑定在singleton作用域中


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

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

所以将它们绑定到会话作用域毫无意义:Guice不能为每个会话创建一个不同的servlet实例

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

据我所知,您可以将任何需要的内容绑定到会话范围,问题是在您的示例中,
Foo
似乎是
servlet
的子类,并且servlet必须绑定在
单例
范围内


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

Ok。谢谢但创建ServletScopes的目的是什么?我应该把会话范围的变量放在哪里?当您使用Guice servlet扩展时,Guice实际上会创建servlet。它要求servlet是单例的,因为它与servlet规范一致。非常感谢。这就是我需要的。