2015-06-11 35 views
0

林新与DropWizard和有这种情况:Dropwizard如何配置数据源?

我们有,现在将被分成3个部分的web应用程序:

  • 核心:先后所有的商业智能,
  • 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 I我可以在Dropwizard项目中配置它,但是从我一直在阅读的帖子看来,我无法做到这一点,所以我的问题是,我如何配置我的核心可以使用的简单数据源?

在此先感谢

+0

嗨,你的核心使用哪种数据库框架?我在我的核心应用程序中使用hibernate有类似的问题,最后我做的是在API上创建一个hibernate包(https://dropwizard.github.io/dropwizard/manual/hibernate.html),并发送' SessionFactory'到核心'hibernateBundle.getSessionFactory()'。 – Carlos

+0

嗨Carlos,核心我们没有使用任何数据库框架,只是一个普通的javax.sql.DataSource。 – user2171127

+0

也许是一个长镜头,但为什么不尝试:使用DataSourceFactory字段创建一个配置类,如链接中的一个。然后在你的run方法中执行'ManagedDataSource a = configuration.getDataSourceFactory()。build(new MetricRegistry(),“Database metrics”);'得到一个ManagedDataSource(实现javax.sql.DataSource),然后在你的核心中使用Datasource项目。 – Carlos

回答

2

你必须关注的问题在你的代码的分离是Dropwizard是不会解决的。

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

在这里你有一个静态方法,旨在为你提供一个用户名给定一个ID。该方法从哪里获取数据?谁知道?这是一种不提供其他输入的静态方法,因此对于所有意图和目的而言,这是“魔术”。

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

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方式让DataSource一点不使用JDBI。剩下的部分初始化JNDI上下文,并以适当的名称注册数据源。

+0

谢谢!直到我将“org.eclipse.jetty:jetty-jndi”添加到我的代码中时,我得到了“javax.naming.NoInitialContextException”。 – Rich