我是Google Guice框架中的新手,我有一个关于注入guice servlet和使用RequestScope的问题。好吧,让我从我的代码中给出一些例子,让事情清楚。
我有一个Bean类,例如Bean ..
@RequestScope
public class Bean {
private String user;
private String pass;
// constructor which is @inject
// getters and setters
}
这里我有一个servlet
@Singleton
public class MainServlet extends HttpServlet {
doGet(HttpServletRequest request, HttpServletResponse response) {
.... some code
Injector injector = Guice.createInjector();
ValidUser validUser = injector.getInstance(ValidUser.class)
// Here i got the below exception
}
}
com.google.inject.ConfigurationException: Guice configuration errors:
1) No scope is bound to com.google.inject.servlet.RequestScoped.
at Bean.class while locating Bean
这里有趣的是,我们知道servlet范围是单例。 而且我怎样才能从http请求中获取 - Bean实例?因为据我所知,在注入Bean类的实例后,它会进入http请求,对吧?
欢迎任何帮助或示例。 谢谢 Br
答案 0 :(得分:16)
您正在servlet中创建并使用Injector
doGet
方法...它没有机会了解范围或当前请求或任何东西!
Guice Servlet要求您设置所有请求以通过GuiceFilter
并创建GuiceServletContextListener
的子类,以创建整个应用程序将使用的Injector
。这些都在Servlets部分的Guice用户指南中进行了描述。
完成后,您可以@Inject
将MainServlet
内容放入@Inject
(即使使用Bean
带注释的构造函数)。要在servlet中获取Provider<Bean>
的请求范围实例,您需要注入Bean
(因为beanProvider.get()
的范围小于单例servlet)。在请求中,您可以致电Bean
获取当前请求的{{1}}。
请注意,servlet是单例,因为它们在普通的Java servlet世界中也是如此...它们每个应用程序只创建一次,并且该单个实例用于对该servlet的所有请求。