当我看到“不允许再入境”时,这是什么意思?

时间:2015-08-03 08:23:35

标签: java exception dependency-injection guice illegalstateexception

我正在尝试这样做。

class A extends B {
    Injector injector = Guice.CreateInjector(this);
    // ......statements...
}

投掷IllegalStateException:不允许重新进入

com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
    at com.google.inject.AbstractModule.configure(AbstractModule.java:55)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
    at com.google.inject.spi.Elements.getElements(Elements.java:101)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:72)
    at com.google.inject.Guice.createInjector(Guice.java:62)

为什么会这样?

1 个答案:

答案 0 :(得分:4)

如果您在Guice.createInjector()方法中的相同模块实例上调用configure,则唯一的方法就是这样。如果你像在你的例子中那样在对象构造中调用它,那么不会发生。这里的代码将重现该堆栈跟踪。

class B extends AbstractModule {
    protected void configure() {
    }
}

public class A extends B {
  Injector injector;

  @Override
  protected void configure() {
    injector = Guice.createInjector(this);
  }
}

public class GuiceTest {
  public static void main(String... args) {
    A a = new A();
    Injector inj = Guice.createInjector(a);
  }
}

我对如何修复它的回答是......不要这样做!甚至没有任何理由这么做。

在您知道自己在做什么之前,不应该在您的应用程序中多次致电Guice.createInjector(),而且这一次通常在Main课程中,或者在您的static void main课程中{1}}方法本身..我使用Guice来处理所有事情,而仍然没有在同一个应用程序中多次调用它。我们的想法是,您构建模块,将它们传递到您的注入器中,然后让Guice为您注入其他所有内容。请参阅:Getting Started

你想做什么让你尝试这样做?注意:请不要通过编辑您的问题或发表评论来回答我,因为这两件事invalidate this answer.相反,ask a new question解释了您真正想要做的事情,以及{ {3}}