如何配置jetty与Guice和Vaadin一起运行

时间:2011-02-25 19:24:44

标签: java jetty guice vaadin

我像这样创建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();
    }
}

的web.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>
问题是当我运行jetty然后Guice创建servlet实例(在控制台中打印“Test”)但是当我尝试在浏览器中运行应用程序时,我得到NPE并且在控制台“TTest”出现。

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

问题是如何配置jetty只使用guice?

3 个答案:

答案 0 :(得分:2)

你必须创建一个扩展com.​google.​inject.​servlet.ServletModule的guice servlet模块(让我们称之为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>
        <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一起使用它,但我想我的回答对你有所帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Vaadin + GAE + Guice-Servlet - TUTORIAL