在我的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;
}
}
我应该为此工作做些什么改变?
答案 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;我项目中的包裹。
希望这可以提供帮助