我是 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/