从guiceModule访问dropwizard Bundle实例

时间:2018-04-16 09:11:10

标签: java mongodb guice dropwizard

我是dropwizard的新手,我在我的应用程序中使用了GuiceBundle和MongoBundle。 MongoClient包含在一个dropwizard Managed对象中,并且与应用程序的生命周期相关联。

public class SalApplication extends Application<SomeConf> {
...
private GuiceBundle<SomeConf> guiceBundle;
private MongoBundle<SomeConf> mongoBundle;
...

@Override
public void initialize(Bootstrap<SomeConf> bootstrap) {
// build bundles and add to bootstrap
...
}

@Override
public void run(SomeConf someConf, Environment env) throws Exception{
...
MongoClient client = mongoBundle.getClient();
MongoClientManager mongoDB = new MongoClientManager(client);
env.lifecycle().manage(mongoDB); //MongoClientManager implements Managed
}

我的打嗝是,如何获取MongoClient对象。 该对象应该被注入我的DAO中。 但如何从guice模块内部访问MongoClient对象。

如果我在guice模块中构造另一个MongoClient对象,那么Managed Object的重点是什么。我真的很困惑。

2 个答案:

答案 0 :(得分:1)

我建议您编写自己的Guice模块。虽然dropwizard-guice非常有用,但它自2017年2月以来一直没有更新,只支持最高版本1.0.0的DW。模块的基本版本可能如下所示:

public class CustomModule implements Module {

    private final MongoClient mongoClient;

    public CustomModule(MongoClient mongoClient) {
        this.mongoClient = mongoClient;
    }

    @Override
    public void configure(Binder binder) {
        binder.bind(MongoClient.class).toInstance(mongoClient);
    }
}

然后,您可以使用Guice标准方法从Application类中的“run”方法初始化:

public class SalApplication extends Application<SomeConf> {

    ...

    @Override
    public void run(SomeConf someConf, Environment env) throws Exception{

        Guice.createInjector(new CustomModule(mongoBundle.getClient());

        ...
    }
}

答案 1 :(得分:0)

我找到了一种更简单的方法来实现我所需要的。

我之前使用的是com.meltmedia.dropwizard.dropwizard-mongo,它的MongoBundle构造了MongoClient,它必须传递给我的ManagedObject。

我停止使用它。相反,我正在使用guice模块中的mongo-java-driver自己构建MongoClient对象,并将其注入到我的托管对象的构造函数中。