Guice and Servlet - Общая проблема понимания? - PullRequest
1 голос
/ 15 июня 2011

Я хочу использовать Guice в приложении Vaadin (но это не должно зависеть от Vaadin).

В моем Vaadin MyApp (расширяющий класс приложения) я могу использовать аннотацию @Inject для внедрения реализаций, определенных в модуле в моем Custom ContextListener, расширяющем GuiceServletContextListener, где создается Injector.

Теперь я хочу получить доступ к Реализациям из любого места в моем приложении, но я всегда получаю NullPointerExceptions.

Я подумал, что достаточно создать объект Top (который будет классом приложения в mycase (?)) С хитростью, чтобы каждый объект, созданный из этого класса (в данном случае с новым), мог внедрить.

Если я создам каждый объект с помощью Injector.getInstance (..), он будет работать, но при таком подходе мне придется создавать каждый «промежуточный» класс, который даже не использует @Inject с этим методом.

Возможно ли то, что я надеюсь сделать, даже с помощью хитрости, или я что-то упустил? Моя основная цель - получить доступ к реализации 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);

}

И я определил Guice Filter и ContextListener в web.xml

Ответы [ 2 ]

0 голосов
/ 19 июня 2011

Что вы подразумеваете под «так, чтобы каждый объект, созданный из этого класса (в данном случае с новым), мог внедрить»? Если вы создаете экземпляры объектов в своем классе Application с использованием new, то я думаю, что это ваша проблема. По сути, Guice заменяет new. Вам нужно будет создать экземпляры своих сервисных объектов с помощью Guice (либо путем их инъекции, либо с помощью injector.getInstance()), чтобы их члены или конструкторы были внедрены Guice.

0 голосов
/ 15 июня 2011

Guice работает только в контейнере сервлетов, если в вашем файле web.xml активирован необходимый voodoo.

Возможно, вы захотите прочитать документацию по установке и настройке guice-servlet.jar - http://code.google.com/p/google-guice/wiki/Servlets

...