0

我像这样创建guice servlet:

public class GuiceApplicationServlet extends AbstractApplicationServlet {

    protected Provider<Application> applicationProvider;

    public GuiceApplicationServlet() {
        System.out.println("TTest");
    }

    @Inject
    public GuiceApplicationServlet(Provider<Application> applicationProvider) {
        super();
        this.applicationProvider = applicationProvider;
        System.out.println("Test");
    }

    @Override
    protected Class<? extends Application> getApplicationClass()
            throws ClassNotFoundException {
        return Application.class;
    }

    @Override
    protected Application getNewApplication(HttpServletRequest request)
            throws ServletException {
        return applicationProvider.get();
    }
}

网页.xml:

    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>pl.koziolekweb.vaadin.guice.servlet.VaadinGuiceConfiguration</listener-class>
    </listener>


    <servlet>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <servlet-class>pl.koziolekweb.vaadin.guice.servlet.GuiceApplicationServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

问题是,当我运行码头时,Guice 创建了 servlet 实例(在控制台中打印“测试”)但是当我尝试在浏览器中运行应用程序时,我得到 NPE 并在控制台中出现“TTest”。

因此,码头创建了另一个不受 guice 管理的 servlet 实例。

问题是如何将码头配置为仅使用 guice?

4

3 回答 3

2

您必须创建一个扩展的 guice servlet 模块com.​google.​inject.​servlet.ServletModule(我们称之为FooModule)。您可以通过覆盖configureServlets()方法在那里定义您的绑定和到 servlet 的路径。

然后你必须通过扩展来创建上下文监听器com.google.inject.servlet.GuiceServletContextListener(我们称之为BarContextListener)。在那里你必须实现getInjector()方法,类似于:

protected Injector getInjector() {
        Injector injector = Guice.createInjector(new FooModule());
        return injector;
    }

然后从 web.xml 中删除所有 servlet 映射,然后放置过滤器:

   <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

和上下文侦听器您创建:

<listener>
        <listener-class>path.to.package.of.context.listener.BarContextListener</listener-class>
    </listener>

这样,您的所有 servlet 都由 Guice 管理,并在您的应用程序的服务器端启用依赖注入。它在 Tomcat 中适用于我,因此它也应该适用于 Jetty。不要忘记包含guice-servlet-<version>.jar在您的类路径中。我没有将它与 Vaadin 一起使用,但我想我的回答对您有所帮助。

于 2011-02-28T10:14:50.327 回答
0

因为 Guice 应该创建所有 Servlet 实例,所以您必须从文件中删除servletservlet-mapping条目。web.xml

于 2011-02-28T09:25:37.400 回答
0

我已经写了一篇关于这个主题的博客文章,我相信它会很有帮助:

Vaadin + GAE + Guice-Servlet - 教程

于 2012-09-26T16:33:26.203 回答