我正在App.java(这是我模块的主类)内创建一个托管对象。我正在使用带有dropwizard框架的guice库,并且只有在使用IntelliJ运行时才获得此异常,如果我使用mvn运行相同的代码,则它的工作原理非常好,这很奇怪,超出了我的理论范围。因此,如果有人经历过类似的事情或对此有一定的理论基础,请分享。随时询问任何细节。
environment.lifecycle().manage(new Managed() {
@Override
public void start() throws Exception {
}
@Override
public void stop() throws Exception {
}
});
异常stacktrace:-
Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors:
1) Injecting into inner classes is not supported. Please use a 'static' class (top-level or nested) instead of com.phonepe.growth.App$4.
at ru.vyarus.dropwizard.guice.module.installer.InstallerModule.bindExtension(InstallerModule.java:191) (via modules: ru.vyarus.dropwizard.guice.module.GuiceSupportModule -> ru.vyarus.dropwizard.guice.module.installer.InstallerModule)
1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
at com.google.inject.Guice.createInjector(Guice.java:99)
at ru.vyarus.dropwizard.guice.injector.DefaultInjectorFactory.createInjector(DefaultInjectorFactory.java:20)
at ru.vyarus.dropwizard.guice.GuiceBundle.createInjector(GuiceBundle.java:191)
at ru.vyarus.dropwizard.guice.GuiceBundle.run(GuiceBundle.java:138)
at ru.vyarus.dropwizard.guice.GuiceBundle.run(GuiceBundle.java:93)
at io.dropwizard.setup.Bootstrap.run(Bootstrap.java:200)
at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:42)
at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:85)
at io.dropwizard.cli.Cli.run(Cli.java:75)
at io.dropwizard.Application.run(Application.java:79)
at com.phonepe.growth.App.main(App.java:48)
答案 0 :(得分:1)
这实际上是guicey类路径扫描(.enableAutoConfig
)中的错误。
您的应用程序类已被扫描覆盖,因此内部类也可见:从想法“托管”启动应用程序时,内部类(由编译器为new Managed() {...}
创建)被检测并注册为扩展,也指在guice上下文中注册。但是guice无法实例化内部类并引发错误。
您可以使用.printLifecyclePhasesDetailed()
启用额外的诊断消息(在guice捆绑包上),并看到从构思运行时确实出现了其他扩展名。
当然可以肯定,当您从maven运行应用程序时,它会先内置到jar中,然后启动。在这种情况下,类路径扫描的工作方式略有不同,并且看不到内部类(在jar内)。因此一切正常。
请注意,您不需要手动实例化和注册托管对象(和其他常见对象):您只需declare managed as a separate class,guicey就会找到它并正确注册(两者在guice和dropwizard)。这是expected way of extensions registrations,尤其是与类路径扫描一起使用。