当前位置: 首页 > 知识库问答 >
问题:

Dropwizard, JDBI, Guice,

暨宸
2023-03-14

我一直想利用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>

注意:我正在使用管理程序版本 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)

但是,在我的应用程序中,我使用了他们在dropwizer-guice github页面上显示的相同设置:

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 );
    }
}

有人觉得这有什么不对吗???或者更好的是,有人知道治理者的工作示例吗

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
    }
}

注意:已排除要过帐的包/导入,但所有这些类都存在于同一个包中。

共有1个答案

孟品
2023-03-14

看来我错过了治理者正在引入的guice-multi binding模块...

对于调速器1.3.3,您需要排除以下内容:

   <dependency>
        <groupId>com.netflix.governator</groupId>
        <artifactId>governator</artifactId>
        <version>1.3.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.inject</groupId>
                <artifactId>guice</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.inject.extensions</groupId>
                <artifactId>guice-multibindings</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

特别感谢乔纳森·哈伯为我指出了这个问题:https://github.com/HubSpot/dropwizard-guice/issues/54

 类似资料:
  • 你好,我正在尝试使用dropwizard框架创建一个应用程序。我有DAO类impl,它需要一个连接管理器实例的句柄,然后用于获取数据库连接。我有一个多租户数据库应用程序。这个连接管理器将是一个自定义实现。 该应用程序使用hikari cp作为连接池和mysql数据库。我想使用dropwizard托管对象功能初始化数据源和连接池。一旦数据源被初始化,我想使用guice绑定在每个dao类中注入连接管理

  • 运行CRON JOB时,得到一个异常,说连接已经关闭。应用程序正在dropwizard上运行,以下是数据库配置 请帮助解决问题。

  • 我有一个简单的CRUD应用程序,其中包含dropwizard中的后端代码。整个应用程序只包括简单的资源类和crud操作,但涉及一些业务逻辑的情况除外。 我试图将其提取到服务中,而不是将其放入资源类本身。但为此,我的服务需要一个ondemand jdbi连接来访问数据并完成它的工作。 我所有的连接字符串和配置值都在YML文件中。由于这个应用程序将运行在具有不同yml文件的不同服务器上,我不想硬编码y

  • 我有这个Pojo: 这是我的结果集映射器: 如何从数据库中少取一列。例如,在一些查询中,我只获取tagUuid和name,而不获取其他字段。但是如果我这样做,我会得到一个例外:org.skife.jdbi.v2.exceptions。ResultSetException:尝试遍历结果集时引发异常。我试图创建一个没有其他参数的附加标记构造函数。 这是我尝试运行的查询:

  • 我有两个像这样的jdbi刀: 我想在一个事务中执行两个道的保存,例如: 在Spring中,我使用了@transactional注释。我可以使用dropwizard和jdbi做什么?

  • 我正试图设置一个dropwizard项目,但我卡住了。当我试图用@getGeneratedKeys获得自动生成的id字段时,我会得到以下异常: 请求是一个简单的JSON请求 我将通过重新组织数据库中的列来解决这个问题,但如果可能的话,我希望有一个健壮的实现:在使用@GetGeneratedKeys注释时,有没有方法指定id列的列名?(org.skife.jdbi.v2.util.LongMappe