Guice和Servlet - 一般理解问题?

时间:2011-06-15 19:42:24

标签: java servlets guice vaadin

我想在Vaadin应用程序中使用Guice(但这不应该是Vaadin特定的。)

在我的Vaadin MyApp(扩展应用程序类)中,我可以使用@Inject批注在我的自定义ContextListener中注入模块中定义的实现,扩展GuiceServletContextListener,其中创建了Injector。

我现在想在我的应用程序中访问Everywhere中的实现,但我总是得到NullPointerExceptions。

我认为用posice创建Top对象(在mycase(?)中是应用程序类)就足够了,因此从这个类创建的每个对象(在这种情况下都是new)都可以注入。

如果我使用Injector.getInstance(..)创建每个对象,它都可以工作,但是使用这种方法我必须创建每个“中间”类,甚至不使用@Inject和这个方法。

我希望用guice做什么,或者我错过了什么?我的主要目的是从我的项目中的任何地方访问DAOFactory实现(需要是会话作用域),而不将其传递给每个构造函数。

谢谢,iamgalaxys

我正在使用的一些代码:

ApplicationServlet:

@Singleton
public class GuiceApplicationServlet extends AbstractApplicationServlet {

    private static final long serialVersionUID = -5729153715228068816L;

    // Guice stuff
    protected final Provider<Application> applicationProvider;
    @Inject
    public GuiceApplicationServlet(Provider<Application> applicationProvider) {
            this.applicationProvider = applicationProvider;
    }
    @Override
    protected Class getApplicationClass() throws ClassNotFoundException {
            return Application.class;
    }
    @Override
    protected Application getNewApplication(HttpServletRequest request) throws ServletException {
            return applicationProvider.get();
    }

ContextListener:

public class MyContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
ServletModule module = new ServletModule() {
            @Override
            protected void configureServlets() {
...
serve("/*").with(GuiceApplicationServlet.class, params);

}

我在web.xml中定义了Guice Filter和ContextListener

2 个答案:

答案 0 :(得分:0)

如果你在web.xml中激活了必要的voodoo,Guice只能在servlet容器中工作。

您可能需要阅读有关如何安装和配置guice-servlet.jar的文档 - http://code.google.com/p/google-guice/wiki/Servlets

答案 1 :(得分:0)

你是什么意思“所以从这个类创建的每个对象(在这种情况下使用new)都可以注入”?如果您使用Applicationnew课程中实例化对象,那么我认为这是您的问题。从本质上讲,Guice取代了new。您需要使用Guice实例化您的服务对象(通过注入它们,或使用injector.getInstance()),以便Guice注入其成员或构造函数。