我是DropWizard的新手并且遇到这种情况:
我们有一个Web应用程序,现在将分为3个部分:
我首先尝试使用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可以使用的简单数据源?
提前致谢
答案 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上下文并以适当的名称注册数据源。