私は現在、Dropwizard + Guice + Jersey ベースのアプリケーションを構築しており、当面はデータベース アクセスが JDBI によって処理されます。
私が達成しようとしているのは、リソースがサービス クラスにアクセスし、DAO クラスがデータベースにアクセスする典型的なエンタープライズ アーキテクチャを実現することです。これらすべてを適切な DI 方法で接続できればよいのですが、他のすべてが失敗した場合は、アプリケーションの run() メソッドでオブジェクト グラフを作成できると思います。
だから、私は以前にここで言及されたこの問題に遭遇しています: DBIFactory を取得するには、環境と構成の両方が必要です。これらは、run() 時ではなく、Guice が注入マジックを実行するときに何らかの形で利用可能である必要があります。 .
Dropwizard と Guice の初心者である私がこれまでにまとめることができたのは、DAO オブジェクトのプロバイダーが必要であるということです。
public class UserDAOProvider implements Provider<UserDAO> {
@Inject
Environment environment;
@Inject
Configuration configuration;
@Override
public UserDAO get() {
final DBIFactory factory = new DBIFactory();
final (MyConfiguration) config = (MyConfiguration) configuration;
DBI jdbi = null;
try {
jdbi = factory.build(environment, config.getDataSourceFactory(),
"mysql");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jdbi.onDemand(UserDAO.class);
}
}
これをシングルトン プロバイダーとして登録すると、UserDAO をサービスに挿入できるようになります。
では、実際に環境をプロバイダーに注入するにはどうすればよいでしょうか。現在、環境に適したコンストラクターが見つからないという Guice で立ち往生しているため、Dropwizard 自体から取得せずにインスタンス化しようとしています。
これは実行可能のようです。DropWizardEnvironmentModuleが私が必要としているものだと思うdropwizard-guiceパッケージがあります。しかし、物事を組み立てる方法を理解するために、ここでパズルのピースが欠けているように感じます. これまでのところ、完全に機能する例を見つけることができませんでした...