我目前正在构建一个基于 Dropwizard + Guice + Jersey 的应用程序,其中数据库访问暂时由 JDBI 处理。
我想要实现的是拥有典型的企业架构,其中资源访问服务类访问 DAO 类,该类又访问数据库。以适当的 DI 方式将所有这些连接起来会很好,尽管我想如果其他所有方法都失败了,我可以在应用程序的 run() 方法中构建我的对象图。
所以,我遇到了之前在这里提到的这个问题:获取 DBIFactory 需要环境和配置,它们需要在 Guice 执行其注入魔法时而不是在 run()-time 时可用.
作为一个 Dropwizard 和 Guice 菜鸟,到目前为止,我设法整合的是我的 DAO 对象需要一个 Provider,这与
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 注入我的服务中。
现在,我们如何真正将环境注入到 Provider 中?目前我被困在 Guice 抱怨没有为环境找到合适的构造函数,所以它试图实例化它而不是从 Dropwizard 本身获取它。
看起来这是可行的;有一个dropwizard-guice包,我认为它的 DropWizardEnvironmentModule 是我需要的。但我觉得我只是在这里错过了一些难题,以了解如何将事物组合在一起。到目前为止,我还没有找到一个完整的工作示例......