3

在我的 GWT 应用程序中,我试图设置一个 DI 机制,它可以让我随处拥有所有常用的必要东西。我正在使用 google-gin,它是 GWT 的 guice 改编版。我有一个注入器接口定义如下:

@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

4 回答 4

2

老问题,但有同样的问题,我一直在这里。我终于找到了知道在 ginjection 期间哪个班级搞砸的方法。

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

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

希望这可以帮助其他人!

于 2012-02-27T13:59:30.890 回答
1

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

于 2013-01-22T10:38:26.843 回答
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. 我建议你用 just 试试这个,in(Singleton.class)我进一步假设你并不真的需要单例来渴望。似乎其他人的行为也有问题,有迹象表明这与在少数情况下过度使用asEagerSingleton或误解注释有关。@Singleton

于 2011-09-24T21:26:38.493 回答
0

有同样的问题问题,同样的跟踪,错误是我在我的“客户端”类中使用了“服务器”类,所以 GIN 找不到这些类。

我的意思是“服务器”和“客户端”我项目中的包。

希望这可以帮助

于 2011-12-09T09:04:36.707 回答