Как настроить пристань для запуска с Guice и Vaadin - PullRequest
0 голосов
/ 25 февраля 2011

Я создаю guice сервлет, как это:

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>

Проблема в том, что когда я запускаю причал, тогда Guice создает экземпляр сервлета (выведите «Test» в консоли), но когда я пытаюсь запустить приложение в браузере, я получаю NPE и в консоли появляется «TTest».

Таким образом, пристань создаст еще один экземпляр сервлета, которым не управляет хитрость.

Вопрос в том, как настроить причал, чтобы использовать только подсказку?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Вы должны создать модуль сервлета guice, который расширяет com.​google.​inject.​servlet.ServletModule (назовем его FooModule). Там вы определяете свои привязки и пути к сервлетам, переопределяя метод configureServlets().

Затем вы должны создать прослушиватель контекста, расширив com.google.inject.servlet.GuiceServletContextListener (назовем его BarContextListener). Там вы должны реализовать метод getInjector(), например:

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

Затем вы удаляете все отображения сервлетов из вашего 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>path.to.package.of.context.listener.BarContextListener</listener-class>
    </listener>

Таким образом, все ваши сервлеты управляются Guice и позволяют внедрять зависимости на стороне сервера вашего приложения. Он работает для меня в Tomcat, поэтому он также должен работать на Jetty. Не забудьте включить guice-servlet-<version>.jar в ваш путь к классам. Я не использовал его с Ваадином, но, думаю, мой ответ немного помог Тебе.

0 голосов
/ 26 сентября 2012

Я написал сообщение в блоге на эту тему, я уверен, что это будет очень полезно:

Ваадин + GAE + Guice-Servlet - учебник

0 голосов
/ 28 февраля 2011

Поскольку Guice должен создать все ваши экземпляры сервлета, вы должны удалить записи servlet и servlet-mapping из файла web.xml.

...