我看到 "Re-entry is not allowed" 是什么意思?
What does it mean when I see "Re-entry is not allowed"?
我正在尝试做这样的事情。
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)
为什么会这样?
发生这种情况的唯一方法是,如果您在 configure
方法 内的 同一模块实例上调用 Guice.createInjector()
。如果像示例中那样在对象构造时调用它,不会 发生。这是将重现该堆栈跟踪的代码。
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
class 或许多你的 static void main
方法本身的情况。我对所有事情都使用 Guice,而且我 仍然从未在同一个应用程序中多次调用它 。这个想法是你构建你的模块,将它们传递给你的注入器,然后让 Guice 为你注入其他所有东西。参见:Getting Started
是什么促使您尝试这样做的?注意:请不要通过编辑问题或评论来回答我,因为这两件事会 invalidate this answer. Instead, ask a new question that explains what you're really trying to do, and avoid the XY problem.
我正在尝试做这样的事情。
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)
为什么会这样?
发生这种情况的唯一方法是,如果您在 configure
方法 内的 同一模块实例上调用 Guice.createInjector()
。如果像示例中那样在对象构造时调用它,不会 发生。这是将重现该堆栈跟踪的代码。
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
class 或许多你的 static void main
方法本身的情况。我对所有事情都使用 Guice,而且我 仍然从未在同一个应用程序中多次调用它 。这个想法是你构建你的模块,将它们传递给你的注入器,然后让 Guice 为你注入其他所有东西。参见:Getting Started
是什么促使您尝试这样做的?注意:请不要通过编辑问题或评论来回答我,因为这两件事会 invalidate this answer. Instead, ask a new question that explains what you're really trying to do, and avoid the XY problem.