【问题标题】:google-gin a provider needs a dependency. NullPointerException BindingsProcessor.java:498google-gin 提供者需要依赖项。 NullPointerException BindingsProcessor.java:498
【发布时间】:2011-09-23 12:30:47
【问题描述】:

在我的 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;
    }
}

我应该改变什么才能让它工作?

【问题讨论】:

    标签: gwt guice gwt-gin


    【解决方案1】:

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

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

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

    希望这可以帮助其他人!

    【讨论】:

      【解决方案2】:

      虽然我实际上并没有看到您遇到的错误与被注入的 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 注释有关。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          希望对你有帮助

          【讨论】:

            猜你喜欢
            • 2021-09-23
            • 2012-01-13
            • 2018-01-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-03
            相关资源
            最近更新 更多