java - Dropwizard如何配置数据源?

标签 java database jetty dropwizard

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

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

  • 核心:拥有所有商业智能,
  • api: 将是一个将调用核心方法、类等的 dropwizard 项目,
  • 和客户:实际上是几个客户;网络、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 项目上配置它,但是从我阅读的一些帖子看来我不能那样做,所以我的问题是,我如何配置我的核心类可以使用的简单数据源?

提前致谢

最佳答案

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

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

这里有一个静态方法,旨在为您提供给定 ID 的用户名。该方法从哪里获取数据?谁知道?这是一个不提供其他输入的静态方法,因此无论出于何种意图和目的,它都是“神奇的”。

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

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

此时我在猜测,因为您还没有真正说明如何您需要配置 JNDI,但我假设,因为大多数关于 JNDI 的教程都是这样做的,您需要一个 DataSource 对象绑定(bind)到一个看起来像 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 上下文并以适当的名称注册数据源。

关于java - Dropwizard如何配置数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769955/

相关文章:

database - 在访问中准备数据库?需要帮忙!

jakarta-ee - 过滤时如何覆盖jetty-maven-plugin中的web.xml

java - 线程 "Thread-2"java.lang.NoClassDefFoundError : org/eclipse/jetty/server/Handler 中出现异常

java - 如何通过连接集合限制结果集

java - 安卓短信API

java - 如何用 swing 杀死一个线程?

mysql - 创建一个属于多于 2 个模型的关系

java - 为什么按钮对象的行为会因声明位置的不同而不同

java - 如何在不暴露密码的情况下连接到需要密码的数据库?

angularjs - Angular $http 状态 (-1)