google-gin提供者需要依赖。 NullPointerException BindingsProcessor.java:498

时间:2011-09-23 12:30:48

标签: gwt guice gin

在我的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 个答案:

答案 0 :(得分:2)

老问题,但有同样的问题,我一直在这里。我终于找到了方法来了解哪一堂课在注射过程中弄得一团糟。

当我在开发模式下启动我的应用程序并将堆栈放到Trace时,我注意到有一个步骤叫做:“验证新编译的单元”。 在这之下,我有一个错误,但我没有注意到它,因为我不得不扩展2个甚至不是红色的节点。

错误是"No source code available for type com.xxx.xxxx ...",这是由于客户端导入错误导致无法转换为Javascript。

希望这可以帮助其他人!

答案 1 :(得分:1)

虽然我实际上并没有看到你所获得的错误与注入的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)尝试这个,我进一步假设你真的不需要单身人士渴望。似乎others had problems也有行为,有一些迹象表明它与过度使用asEagerSingleton或在少数情况下误解@Singleton注释有关。

答案 2 :(得分:1)

我还使用GIN 1.x获得了很多NullPointerException警告,但没有真正解释发生的事情。当我升级到gin 2.0时,我被高度准确地告知了错误是什么。升级到您提出此问题一年后发布的2.0版本可能会对您有所帮助。

答案 3 :(得分:0)

有同样的问题,相同的跟踪和错误是我使用的&#34;服务器&#34;在我的&#34;客户&#34;类,所以GIN找不到这些类。

我的意思是&#34;服务器&#34;和&#34;客户&#34;我项目中的包裹。

希望这可以提供帮助