Google-джин провайдер нуждается в зависимости.NullPointerException BindingsProcessor.java:498 - PullRequest
3 голосов
/ 23 сентября 2011

В моем приложении GWT я пытаюсь настроить механизм DI, который позволил бы мне иметь под рукой всю необходимую информацию. Я использую google-gin, который является адаптацией к GWT. У меня есть интерфейс инжектора, определенный как это:

@GinModules(InjectionClientModule.class)
public interface MyInjector extends Ginjector {
    public PlaceController getPlaceController();
    public Header getHeader();
    public Footer getFooter();
    public ContentPanel getContent();
    public EventBus getEventBus();
    public PlaceHistoryHandler getPlaceHistoryHandler();
}

Мой модуль впрыска такой:

public class InjectionClientModule extends AbstractGinModule {
    public InjectionClientModule() {
        super();
    }

    protected void configure() {
        bind(Header.class).in(Singleton.class);
        bind(Footer.class).in(Singleton.class);
        bind(ContentPanel.class).in(Singleton.class);
        bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
        bind(PlaceController.class).toProvider(PlaceControllerProvider.class).asEagerSingleton();
        bind(PlaceHistoryHandler.class).toProvider(PlaceHistoryHandlerProvider.class).asEagerSingleton();
    }
}

При звонке MyInjector injector = GWT.create(MyInjector.class); я получаю следующее исключение:

java.lang.NullPointerException: null
at com.google.gwt.inject.rebind.BindingsProcessor.createImplicitBinding(BindingsProcessor.java:498)
at com.google.gwt.inject.rebind.BindingsProcessor.createImplicitBindingForUnresolved(BindingsProcessor.java:290)
at com.google.gwt.inject.rebind.BindingsProcessor.createImplicitBindingsForUnresolved(BindingsProcessor.java:278)
at com.google.gwt.inject.rebind.BindingsProcessor.process(BindingsProcessor.java:240)
at com.google.gwt.inject.rebind.GinjectorGeneratorImpl.generate(GinjectorGeneratorImpl.java:76)
at com.google.gwt.inject.rebind.GinjectorGenerator.generate(GinjectorGenerator.java:47)
at com.google.gwt.core.ext.GeneratorExtWrapper.generate(GeneratorExtWrapper.java:48)
at com.google.gwt.core.ext.GeneratorExtWrapper.generateIncrementally(GeneratorExtWrapper.java:60)
at com.google.gwt.dev.javac.StandardGeneratorContext.runGeneratorIncrementally(StandardGeneratorContext.java:647)
at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:41)
at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:78)
at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:268)
at com.google.gwt.dev.shell.ShellModuleSpaceHost.rebind(ShellModuleSpaceHost.java:141)
at com.google.gwt.dev.shell.ModuleSpace.rebind(ModuleSpace.java:585)
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:455)
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49)
at com.google.gwt.core.client.GWT.create(GWT.java:97)

Проблема в том, что класс PlaceController фактически зависит от одной из других зависимостей. Я реализовал его провайдер так:

public class PlaceControllerProvider implements Provider<PlaceController> { 
    private final PlaceController placeController;

    @Inject
    public PlaceControllerProvider(EventBus eventBus) {
        this.placeController = new PlaceController(eventBus);
    }

    @Override
    public PlaceController get() {
        return placeController;
    }
}

что я должен изменить, чтобы это работало?

Ответы [ 4 ]

2 голосов
/ 27 февраля 2012

Старый вопрос, но с той же проблемой я продолжал падать здесь.Наконец-то я нашел способ узнать, какой класс работает во время ginjection.

Когда я запускаю свое приложение в режиме разработки и помещаю стек в Trace, я заметил, что есть шаг, который называется: «Проверка вновь скомпилированных модулей».При этом у меня была ошибка, но я ее не заметил, поскольку мне пришлось развернуть 2 узла, которые даже не были красного цвета.

Ошибка была "No source code available for type com.xxx.xxxx ...", что было связано с неправильным импортомна стороне клиента, который не может быть преобразован в Javascript.

Надеюсь, что это может помочь другим здесь!

1 голос
/ 22 января 2013

Я также получил много предупреждений об исключении NullPointerException, используя GIN 1.x без реального объяснения того, что произошло.Когда я обновился до джина 2.0, мне с высокой точностью сообщили, что это за ошибка.Вам может помочь обновление до версии 2.0, выпущенной через год после того, как вы задали этот вопрос.

1 голос
/ 25 сентября 2011

Хотя я на самом деле не вижу, как ошибки, которые вы получаете, связаны с внедрением PlaceController, я вижу, что провайдер возвращает одноэлементный PlaceController, даже если провайдер не был связан как активный одиночный или разная сфера применения. Правильный способ написать этого провайдера будет:

public class PlaceControllerProvider implements Provider<PlaceController> { 
    private final EventBus eventBus;

    @Inject
    public PlaceControllerProvider(EventBus eventBus) {
        this.eventBus = eventBus;
    }

    @Override
    public PlaceController get() {
        return new PlaceController(eventBus);
    }
}

Позвольте guice работать с областью видимости, т. Е. «Позволить guice работать на вас».

Кроме этого, я почти уверен, что ваша проблема связана с использованием asEagerSingleton. Я рекомендую вам попробовать это всего лишь с in(Singleton.class), и я также утверждаю, что вам действительно не нужен был синглтон, чтобы жаждать. Кажется, у других тоже были проблемы с поведением, есть некоторые признаки того, что это связано с чрезмерным использованием asEagerSingleton или неправильным пониманием аннотации @Singleton в некоторых случаях.

0 голосов
/ 09 декабря 2011

У меня была та же проблема, та же трассировка, и ошибка была в том, что я использовал "серверные" классы в своих "клиентских" классах, поэтому GIN не может найти эти классы.

Я имею в виду под "сервером""и" клиент "пакеты в моем проекте.

Надеюсь, что это может помочь

...