Я пытался воспользоваться преимуществами Guice и Governator с Dropwizard и JDBI, чтобы использовать ленивые синглтоны для своего класса DBI. Тем не менее, я сталкивался со всеми видами проблем. Я следовал приведенным здесь инструкциям по созданию GovernatorInjectorFactory: https://github.com/HubSpot/dropwizard-guice
Однако я начинаю сталкиваться с проблемами пути к классам между Governator и Dropwizard. Мне пришлось исключить следующие модули в моем pom.xml:
<dependency>
<groupId>com.netflix.governator</groupId>
<artifactId>governator</artifactId>
<version>${com.netflix.governator.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
Примечание Я использую Governator версии 1.3.3.
Но теперь я сталкиваюсь с проблемами, в которых указано, что базовые пакеты не указаны, что на первый взгляд и видя NoSuchMethodError, я думаю, что это может быть еще одна проблема с путем к классам:
WARN [2015-04-08 07:13:04,445]
com.netflix.governator.lifecycle.ClasspathScanner: No base packages specified - no classpath scanning will be done
Exception in thread "main" java.lang.NoSuchMethodError: com.google.inject.binder.AnnotatedBindingBuilder.toProvider(Ljavax/inject/Provider;)Lcom/google/inject/binder/ScopedBindingBuilder;
at com.squarespace.jersey2.guice.InternalJerseyModule.configure(InternalJerseyModule.java:58)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.AbstractModule.install(AbstractModule.java:118)
at com.squarespace.jersey2.guice.BootstrapModule.configure(BootstrapModule.java:44)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.AbstractModule.install(AbstractModule.java:118)
at com.hubspot.dropwizard.guice.JerseyModule.configureServlets(JerseyModule.java:15)
at com.google.inject.servlet.ServletModule.configure(ServletModule.java:55)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
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.internal.InjectorImpl.createChildInjector(InjectorImpl.java:217)
at com.netflix.governator.guice.LifecycleInjector.createChildInjector(LifecycleInjector.java:327)
at com.netflix.governator.guice.LifecycleInjector.createInjector(LifecycleInjector.java:394)
at com.netflix.governator.guice.LifecycleInjector.createInjector(LifecycleInjector.java:348)
at com.gordysc.GovernatorInjectorFactory.create(GovernatorInjectorFactory.java:15)
at com.hubspot.dropwizard.guice.GuiceBundle.initInjector(GuiceBundle.java:105)
at com.hubspot.dropwizard.guice.GuiceBundle.initialize(GuiceBundle.java:96)
at io.dropwizard.setup.Bootstrap.addBundle(Bootstrap.java:142)
at com.gordysc.ExampleApplication.initialize(ExampleApplication.java:22)
at io.dropwizard.Application.run(Application.java:71)
at com.gordysc.ExampleApplication.main(ExampleApplication.java:32)
Однако внутри моего приложения я использую ту же настройку, что и на странице github dropwizard-guice:
public final class ExampleApplication extends Application<ExampleConfiguration> {
private GuiceBundle<ExampleConfiguration> bundle;
@Override
public void initialize( io.dropwizard.setup.Bootstrap<ExampleConfiguration> bootstrap ) {
//@formatter:off
bundle = GuiceBundle.<ExampleConfiguration>newBuilder()
.addModule( new ExampleModule() )
.enableAutoConfig( getClass().getPackage().getName() )
.setConfigClass( ExampleConfiguration.class )
.setInjectorFactory( new GovernatorInjectorFactory() )
.build();
//@formatter:on
bootstrap.addBundle( bundle );
};
@Override
public void run( ExampleConfiguration configuration, Environment environment ) throws Exception {
// TODO Auto-generated method stub
}
public static void main( String[] args ) throws Exception {
new ExampleApplication().run( args );
}
}
Кто-нибудь видит в этом что-то плохое??? Или, что еще лучше, кто-нибудь знает рабочий пример для Governator и Dropwizard 0.8.0, который я мог бы использовать для сравнения? Я добавил свой ExampleModule и GovernatorInjectorFactory ниже для полноты на случай, если я просто идиот и сделал там что-то глупое:
final class ExampleModule extends AbstractModule {
@Provides
private DBIFactory dbiFactory() {
return new DBIFactory();
}
@Inject
@Provides
@LazySingleton
private DBI dbi( ExampleConfiguration configuration, Environment environment, DBIFactory factory ) {
return factory.build( environment, configuration.getDataSourceFactory(), "mysql" );
}
@Override
protected void configure() {
// TODO Auto-generated method stub
}
}
final class GovernatorInjectorFactory implements InjectorFactory {
@Override
public Injector create( final Stage stage, final List<Module> modules ) {
//@formatter:off
return LifecycleInjector.builder()
.inStage( stage )
.withModules( modules )
.build()
.createInjector();
//@formatter:on
}
}
Примечание. Пакеты/импорты исключены для публикации, но все эти классы существуют в одном пакете.