Guice3 Singleton никогда не создается в проекте GAE - PullRequest
0 голосов
/ 24 февраля 2012

Я новичок в Guice и уже застрял:)

Я в значительной степени скопировал классы GuiceConfig, OfyFactory и слегка модифицированные Ofy из Проект Motomapia (который вы можете просмотреть), используя его какs sample.

Я создал GuiceServletContextListener, который выглядит следующим образом

public class GuiceConfig extends GuiceServletContextListener
{
    static class CourierServletModule extends ServletModule
    {
        @Override
        protected void configureServlets()
        {
            filter("/*").through(AsyncCacheFilter.class);
        }
    }

    public static class CourierModule extends AbstractModule
    {
        @Override
        protected void configure()
        {
            // External things that don't have Guice annotations
            bind(AsyncCacheFilter.class).in(Singleton.class);
        }

        @Provides
        @RequestScoped
        Ofy provideOfy(OfyFactory fact)
        {
            return fact.begin();
        }
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent)
    {
        super.contextInitialized(servletContextEvent);
    }

    @Override
    protected Injector getInjector()
    {
        return Guice.createInjector(new CourierServletModule(), new CourierModule());
    }
}

Я добавил этот слушатель в свой web.xml

<web-app>
    <listener>
        <listener-class>com.mine.courierApp.server.GuiceConfig</listener-class>
    </listener>

    <!-- GUICE -->
    <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>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <!-- My test servlet -->
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.mine.courierApp.server.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

OfyFactory выглядит следующим образом

@Singleton
public class OfyFactory extends ObjectifyFactory
{
    Injector injector;

    @Inject
    public OfyFactory(Injector injector)
    {
        this.injector = injector;

        register(Pizza.class);
        register(Ingredient.class);
    }

    @Override
    public <T> T construct(Class<T> type)
    {
        return injector.getInstance(type);
    }

    @Override
    public Ofy begin()
    {
        return new Ofy(super.begin());
    }
}

У Ofy вообще нет аннотаций Guice ...

public class Ofy extends ObjectifyWrapper<Ofy, OfyFactory>
{
    // bunch of helper methods here
}

И, наконец, тестовый сервлет, в котором я пытаюсь использовать введенное поле, выглядит так

public class TestServlet extends HttpServlet
{
    @Inject Ofy ofy;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        ofy.save(new Pizza());
    }
}

Ofy ofy всегда равен нулю.Это никогда не вводится.И он не внедряется, потому что OfyFactory никогда не создается, его конструктор никогда не вызывается.

Не могли бы вы указать, что я делаю неправильно?Почему мой синглтон никогда не создается?

Большое спасибо.

1 Ответ

4 голосов
/ 24 февраля 2012

Вместо определения TestServlet в файле web.xml попробуйте удалить его отображение из web.xml и добавить эту строку в методе configureServlets():

serve("/test").with(TestServlet.class);

Возможно, вам также понадобится связатьTestServlet как Singleton либо путем аннотирования класса с помощью @Singleton, либо путем добавления строки

bind(TestServlet.class).in(Singleton.class);

к одному из модулей.

В действительности Guice нефактически создает ваш сервлет, поэтому он не может внедрить объект Ofy.Guice будет создавать сервлеты только в том случае, если для этого будет задана привязка serve(...).with(...).Любые сервлеты, определенные в web.xml, находятся вне контроля Guice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...