Dropwizard如何配置数据源?

时间:2015-06-11 01:13:03

标签: java database jetty dropwizard

我是DropWizard的新手并且遇到这种情况:

我们有一个Web应用程序,现在将分为3个部分:

  • 核心:拥有所有商业智能,
  • api:将是一个dropwizard项目,将调用核心方法,clases等,
  • 和客户:实际上会有几个客户; web,iphone,android等。

我首先尝试使用dropwizard创建一个小项目,并在核心上调用一些小方法。调用示例:localhost:8080 / NewApi / getUserName?id = 12345;

在我的代码上有这样的东西:

@GET
public String getUser(@Auth User user, @QueryParam("id") Optional<String> id) {

   String userName =  net.newapp.core.data.User.getUserName(id);
    return  userName;
}

但是我无法正确配置数据库。我已经阅读了dropwizard上的JDBI教程,但是示例建议使用DAO和JDBI SQL API,但我已经在核心上有我需要的查询,我不想把这个工作交给Dropwizard。

为了测试核心是否与旧项目正确分离,我使用jetty创建了一个小型webapp并配置了一个简单的jndi数据源,并将核心用作一个简单的库并且工作得很好,并且由于Dropwizard使用了Jetty我试了一下我可以在Dropwizard项目中配置它,但是从一些帖子我一直在阅读它看起来我不能这样做,所以我的问题是,我如何配置我的核心上的clases可以使用的简单数据源?

提前致谢

1 个答案:

答案 0 :(得分:3)

您的代码中存在Dropwizard无法解决的问题分离问题。

String userName = net.newapp.core.data.User.getUserName(id);

这里有一个静态方法,旨在为您提供给定id的userName。该方法从何处获取数据?谁知道?它是一种静态方法,不提供任何其他输入,因此对于所有意图和目的而言,它都是魔法。&#34;

根据您的问题描述,部分&#34;魔法&#34;涉及JNDI查找。但是JNDI查找仍然需要一些&#34; name&#34;查找数据源。除非此处未显示更多代码,否则该名称必须在核心库中进行硬编码。硬编码的魔术常量使得迁移到新框架充其量是困难的。

Dropwizard不太可能支持JNDI,因为魔术行为会使系统难以理解和调试。将Jetty用作http服务器是一个最好保持不变的实现细节。幸运的是,你不需要它。

我在这一点上猜测,因为你还没有真正说过你需要配置JNDI的 ,但我会假设,因为大多数教程在JNDI上这样做,你需要一个DataSource对象绑定到一个看起来像java:comp/env/jdbc/mydatasource的名称。如果是这种情况,并假设您的数据源已配置为as described in the Dropwizard documentation,则可以在Application#run()方法中添加以下内容:

DataSourceFactory factory = config.getDataSourceFactory();
DataSource dataSource = factory.build(environment.metrics(), "mydatasource");

Context context = new InitialContext();
Context compCtx = (Context) context.lookup("java:comp");
Context envCtx = compCtx.createSubcontext("env");
Context jdbcCtx = envCtx.createSubcontext("jdbc");
jdbcCtx.bind("mydatasource", dataSource);

前两行是使用Dropwizard制作不使用JDBI的DataSource的方法。其余部分初始化JNDI上下文并以适当的名称注册数据源。