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

如何将jdbiFactory DAO注入Dropwizard命令?

壤驷志学
2023-03-14

我开始使用Dropwizard,并尝试创建一个需要使用数据库的命令。如果有人想知道我为什么要这么做,我可以提供很好的理由,但这不是我的问题的重点。它是关于Dropwizard中的依赖关系反转和服务初始化和运行阶段。

Dropwizard鼓励使用其DbiFactory构建DBI实例,但为了获得一个实例,您需要Environment实例和/或数据库配置

public class ConsoleService extends Service<ConsoleConfiguration> {

  public static void main(String... args) throws Exception {
    new ConsoleService().run(args);
  }

  @Override
  public void initialize(Bootstrap<ConsoleConfiguration> bootstrap) {
    bootstrap.setName("console");
    bootstrap.addCommand(new InsertSomeDataCommand(/** Some deps should be here **/));
  }

  @Override
  public void run(ConsoleConfiguration config, Environment environment) throws ClassNotFoundException {
    final DBIFactory factory = new DBIFactory();
    final DBI jdbi = factory.build(environment, config.getDatabaseConfiguration(), "postgresql");
    // This is the dependency I'd want to inject up there
    final SomeDAO dao = jdbi.onDemand(SomeDAO.class); 
  }
}

如您所见,您的 run() 方法中有服务及其环境的配置,但需要在其 initialize() 方法中将命令添加到服务的引导程序中。

到目前为止,我已经能够通过在我的命令中扩展ConfiguredCommand并在其run()方法中创建DBI实例来实现这一点,但这是一个糟糕的设计,因为依赖关系应该注入对象中,而不是在内部创建它们。

我更喜欢通过它们的构造函数注入DAO或我的命令的任何其他依赖项,但这对我来说目前似乎是不可能的,因为当我需要创建并将它们添加到它的引导程序时,环境和配置在服务初始化中是不可访问的。

有人知道如何实现这一点吗?

共有2个答案

郭通
2023-03-14

这就是我如何在Dropwizard中使用Guice。在run()方法中添加行

Guice.createInjector(new ConsoleModule());

创建类ConsoleModule

public class ConsoleModule extends AbstractModule {

 public  ConsoleModule(ConsoleConfiguration consoleConfig)
 {
     this.consoleConfig = consoleConfig;
 }

 protected void configure()
{
   bind(SomeDAO.class).to(SomeDAOImpl.class).in(Singleton.class)
  }
}
那博瀚
2023-03-14

你能使用环境命令吗?

 类似资料:
  • 我目前正在构建一个基于Dropwizard Guice泽西岛的应用程序,其中数据库访问暂时由JDBI处理。 我试图实现的是使用典型的企业架构,其中资源访问服务类访问DAO类,DAO类反过来访问数据库。以适当的DI方式将所有这些连接起来会很好,尽管我想如果其他方法都失败,我可以在应用程序的run()方法中构建对象图。 所以,我遇到了之前提到过的问题:获取DBIFactory需要环境和配置,它们需要在

  • 这是我的gradle档案: 在添加了Atmospher-Jursey之后,我得到了以下错误:

  • 6.3. 命令注入 使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。 Exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下: <?php $last = exec('ls', $output, $ret

  • 试图创建一个自定义的,我可以通过Jersey注入到我的资源中。 这在本问题的Java中有涉及。我已经阅读了有关这方面的文档,这些文档也是用Java编写的。最后,GitHub中的一些代码涵盖了相同的主题(通过Dropwizard完成)。 这将全部编译,但在运行时失败,出现以下异常 我不知道是我在向Scala的转换中犯了错误,还是我在注册绑定器时做了错误的事情。

  • 问题内容: 我在与dropwizard的合作中是相当新的。目前,我正在尝试实施HK2依赖项注入。在资源内部可以很好地工作,但是在资源外部不能工作。这是我在做什么: 我创建要注入的类的实例并绑定它们。 在我的资源中,注入工作: 所有这些变量都填充有正确类的实例。 问题是:ContentModuleManager还应该通过注入来获取其中一些类: 但是这些都是空的。有人可以解释为什么这个问题会发生,我该

  • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进